﻿Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop
Imports System.ComponentModel
Imports System.Data
Imports System.IO
Imports System.Text
Imports System.Threading

Class CMReporting
    Private ReportingServicio As New CReportingServicio()
    Private COVAFTLServicio As New CCOVAFTLServicio()
    Dim lstJerarquias As List(Of CJerarquia)
    Dim Aplicacion As _Application
    Dim crElegido As CRebalancing
    Dim MontoAux As Double
    Dim activoAux As Double
    Dim lstAuxiliar As IEnumerable(Of CRebalancing)
    Dim strArchivoGral As String
    Private dtOrdenes As New System.Data.DataTable()
    Private dtCabecera As New System.Data.DataTable()
    Private dtTiposInstrumentos As New System.Data.DataTable()
    Private dtValmer As New System.Data.DataTable()
    Private dtContribuciones As New System.Data.DataTable()
    Private dtCASHMXN As New System.Data.DataTable()
    Private dtJerarquias As New System.Data.DataTable()
    Private dtResumen As New System.Data.DataTable()
    Private dtBusqueda As New System.Data.DataTable()
    Private lstGrupos As New List(Of String)
    Private lstRebalancing As New List(Of CRebalancing)
    Private servGrales As New CServiciosGenerales()
    Private lstBitacora As New List(Of CBitacoraDecalog)
    Private lstPendientes As New List(Of CBitacoraDecalog)
    Private blnExitoVerificacion As Boolean

#Region "Carga página"
    Private Sub CMReporting_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
        Try
            InicializarFechaHora()

            RealizaBusquedaBitacora()

            CargaTiposInstrumentos()

            dtContribuciones.Columns.Add("FondoBench")
            dtContribuciones.Columns.Add("Contribucion", System.Type.GetType("System.Double"))

            dtResumen.Columns.Add("GRUPO")
            dtResumen.Columns.Add("SUBGRUPO")
            dtResumen.Columns.Add("NODO")
            dtResumen.Columns.Add("FONDO")
            dtResumen.Columns.Add("CONTRIBUCION", System.Type.GetType("System.Double"))
            dtResumen.Columns.Add("INSTRUMENTO")
            dtResumen.Columns.Add("ACTIVO", System.Type.GetType("System.Double"))
            dtResumen.Columns.Add("PORCACTIVO", System.Type.GetType("System.Double"))
            dtResumen.Columns.Add("DELTA", System.Type.GetType("System.Double"))
            dtResumen.Columns.Add("PRECIO_SUCIO_24H")
            dtResumen.Columns.Add("DxV", System.Type.GetType("System.Double"))
            dtResumen.Columns.Add("DELTA_REAL")
            dtResumen.Columns.Add("NOMINAL")
            dtResumen.Columns.Add("TIPOINST")
            dtResumen.Columns.Add("INST_NUM")
            dtResumen.Columns.Add("TITULOS", System.Type.GetType("System.Double"))

            dtOrdenes.Columns.Add("Contador")
            dtOrdenes.Columns.Add("Campo1")
            dtOrdenes.Columns.Add("Campo2")

            RefrescaVectorValmer()

            Mouse.OverrideCursor = Cursors.Arrow
        Catch ex As Exception
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Carga página Reporting Bancomer", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region

#Region "Cargas iniciales"
    Private Sub btnRefrescarValmer_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnRefrescarValmer.Click
        Dim msgResultado As MessageBoxResult

        msgResultado = MessageBox.Show("¿Desea refrescar los datos de VALMER?", "Refresca VALMER", MessageBoxButton.YesNo, MessageBoxImage.Question)

        If msgResultado = MessageBoxResult.Yes Then
            RefrescaVectorValmer()

            If dtValmer.Rows.Count > 0 Then
                MessageBox.Show("Favor de verificar los registros insertados manualmente en Rebalancing!","Refresca VALMER",MessageBoxButton.OK,MessageBoxImage.Warning)
            End If
        End If
    End Sub

    Private Function CreaTV(ByVal dr As DataRow) As CTipoValor
        Dim g As CTipoValor = New CTipoValor()
        g.Nombre = dr("TV")
        g.Seleccionado = True
        Return g
    End Function

    Private Function CreaEmisora(ByVal dr As DataRow) As CEmisora
        Dim g As CEmisora = New CEmisora()
        g.Nombre = dr("EMISORA")
        g.Seleccionado = True
        Return g
    End Function

    Private Function CreaSerie(ByVal dr As DataRow) As CSerie
        Dim g As CSerie = New CSerie()
        g.Nombre = dr("SERIE")
        g.Seleccionado = True
        Return g
    End Function

    Private Sub RefrescaVectorValmer()
        Dim ventanaCarga As New CCargaVALMER()
        Dim oBlur As New System.Windows.Media.Effects.BlurEffect()
        oBlur.Radius = 7

        Me.Effect = oBlur

        dtValmer = ventanaCarga.ObtieneDatos()

        grdVALMER.ItemsSource = dtValmer.DefaultView
        grdVALMER.Items.Refresh()

        If dtValmer.Rows.Count > 0 Then
            Dim rwTV() As DataRow, rwEmisoras() As DataRow, rwSeries() As DataRow

            rwTV = dtValmer.DefaultView.ToTable(True, "TV").Select("", "TV ASC")
            Dim lstTV = New List(Of CTipoValor)(From r In rwTV.CopyToDataTable().AsEnumerable() Select (CreaTV(r)))

            rwEmisoras = dtValmer.DefaultView.ToTable(True, "EMISORA").Select("", "EMISORA ASC")
            Dim lstEmisoras = New List(Of CEmisora)(From r In rwEmisoras.CopyToDataTable().AsEnumerable() Select (CreaEmisora(r)))

            rwSeries = dtValmer.DefaultView.ToTable(True, "SERIE").Select("", "SERIE ASC")
            Dim lstSeries = New List(Of CSerie)(From r In rwSeries.CopyToDataTable().AsEnumerable() Select (CreaSerie(r)))

            lsvTV.ItemsSource = lstTV
            lsvTV.UpdateLayout()

            lsvEmisora.ItemsSource = lstEmisoras
            lsvEmisora.UpdateLayout()

            lsvSerie.ItemsSource = lstSeries
            lsvSerie.UpdateLayout()

            btnBuscarVALMER.IsEnabled = True
        Else
            btnBuscarVALMER.IsEnabled = False
        End If        

        Me.Effect = Nothing

        tabContenedor.Visibility = System.Windows.Visibility.Visible
    End Sub

    Private Sub CargaTiposInstrumentos()
        Dim intBitacoraDecalog As Integer

        intBitacoraDecalog = CUtileria.GrabarBitacora("ReportingBancomer", "Carga tipos instrumentos", "Carga de los tipos de instrumentos")

        dtTiposInstrumentos = ReportingServicio.ObtieneTiposInstrumentos()

        CUtileria.CompletarRegBitacora(intBitacoraDecalog)
    End Sub
#End Region

#Region "Refrescar jerarquia"
    Private Sub RefrescaJerarquia()
        Try
            Dim intBitacoraJerarquia As Integer

            Mouse.OverrideCursor = Cursors.Wait

            Dim strNombreJerarquia As String = String.Empty

            intBitacoraJerarquia = CUtileria.GrabarBitacora("ReportingBancomer", "Refresca Jerarquía", "Se refrescan las jerarquías de Reporting Bancomer")

            lstJerarquias = Nothing

            strNombreJerarquia = ReportingServicio.ObtieneNombreJerarquia()

            lstJerarquias = ReportingServicio.ObtieneJerarquias(strNombreJerarquia)

            CUtileria.CompletarRegBitacora(intBitacoraJerarquia)

            Mouse.OverrideCursor = Cursors.Arrow
        Catch ex As Exception
            Dim intBitacoraJerError As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "Refresca Jerarquía", ex.Message)
            CUtileria.CompletarRegBitacora(intBitacoraJerError)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Refresca Jerarquía", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region

#Region "Refrescar resumen"
    Private Sub btnRefrescarResumen_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnRefrescarResumen.Click
        Dim msgResultado As MessageBoxResult

        msgResultado = MessageBox.Show("¿Desea refrescar la información de resumen?", "Refrescar resumen", MessageBoxButton.YesNo, MessageBoxImage.Question)

        If msgResultado = MessageBoxResult.Yes Then
            RefrescaJerarquia()

            RefrescaResumen()
        End If
    End Sub

    Private Sub RefrescaResumen()
        Try
            Mouse.OverrideCursor = Cursors.Wait

            Dim dtDatos As New System.Data.DataTable()
            Dim strCASHMXN As String = String.Empty
            Dim intContador As Integer = 0
            Dim intBitacoraRefresca As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "Refresca Resumen", "Se refrescan todos los datos para mostrarse en el resumen")

            dtCASHMXN = New System.Data.DataTable()
            dtJerarquias = New System.Data.DataTable()
            dtDatos = ReportingServicio.ObtieneFondoBench()

            If dtDatos.Rows.Count > 0 Then
                For Each dr As DataRow In dtDatos.Rows
                    If dr(0) = "" And dr(1) = "" Then
                        Exit For
                    Else
                        strCASHMXN = strCASHMXN + "'" + dr(0).ToString.Trim + "',"

                        If dr(1).ToString.Length > 0 Then
                            strCASHMXN = strCASHMXN + "'" + dr(1).ToString.Trim + "',"
                        End If
                    End If
                Next

                strCASHMXN = strCASHMXN.Substring(0, strCASHMXN.Length - 1)

                dtCASHMXN = ReportingServicio.QueryCASHMXN(strCASHMXN)

            End If

            For Each jer As CJerarquia In lstJerarquias
                If intContador = 0 Then
                    dtJerarquias = ReportingServicio.QueryJerarquias(strCASHMXN, jer.Nombre, jer.Condicion)
                    intContador += 1
                Else
                    dtJerarquias.Merge(ReportingServicio.QueryJerarquias(strCASHMXN, jer.Nombre, jer.Condicion))
                End If
            Next

            dtContribuciones.Clear()

            If dtDatos.Rows.Count > 0 Then
                For Each drAux As DataRow In dtDatos.Rows
                    If drAux(0).ToString.Length > 0 Then
                        Dim drNuevo As DataRow = dtContribuciones.NewRow()

                        Dim sumCASH As Object
                        sumCASH = dtCASHMXN.Compute("SUM(CONTRIBUCION)", "FONDO = '" + drAux(0) + "'")

                        Dim sumJ As Object
                        sumJ = dtJerarquias.Compute("SUM(CONTRIBUCION)", "FONDO = '" + drAux(0) + "'")

                        If sumCASH Is Nothing Or IsDBNull(sumCASH) Then
                            sumCASH = 0
                        End If

                        If sumJ Is Nothing Or IsDBNull(sumJ) Then
                            sumJ = 0
                        End If

                        If (sumCASH + sumJ) = 0 Then
                            drNuevo(1) = 1
                        Else
                            drNuevo(1) = sumCASH + sumJ
                        End If

                        drNuevo(0) = drAux(0)


                        dtContribuciones.Rows.Add(drNuevo)
                        dtContribuciones.AcceptChanges()
                    End If

                    If (drAux(1).ToString.Length > 0) Then
                        Dim drNuevo As DataRow = dtContribuciones.NewRow()

                        Dim sumCASH As Object
                        sumCASH = dtCASHMXN.Compute("SUM(CONTRIBUCION)", "FONDO = '" + drAux(1) + "'")

                        Dim sumJ As Object
                        sumJ = dtJerarquias.Compute("SUM(CONTRIBUCION)", "FONDO = '" + drAux(1) + "'")

                        If sumCASH Is Nothing Or IsDBNull(sumCASH) Then
                            sumCASH = 0
                        End If

                        If sumJ Is Nothing Or IsDBNull(sumJ) Then
                            sumJ = 0
                        End If

                        If (sumCASH + sumJ) = 0 Then
                            drNuevo(1) = 1
                        Else
                            drNuevo(1) = sumCASH + sumJ
                        End If

                        drNuevo(0) = drAux(1)

                        dtContribuciones.Rows.Add(drNuevo)
                        dtContribuciones.AcceptChanges()
                    End If
                Next
            End If

            dtResumen.Clear()

            For Each drC As DataRow In dtCASHMXN.Rows
                Dim drResumen As DataRow = dtResumen.NewRow()

                drResumen("NODO") = drC(0)

                If drC(0).ToString.Length > 0 Then
                    drResumen("SUBGRUPO") = drC(0)

                    If drC(0).ToString.Contains("CETE") Or drC(0).ToString.Contains("BAN NOM") Then
                        drResumen("GRUPO") = "CUPON CERO"
                    ElseIf drC(0).ToString.Contains("N90") Or drC(0).ToString.Contains("TRI BPA") Then
                        drResumen("GRUPO") = "REV90"
                    ElseIf drC(0).ToString.Contains("EXT") Or drC(0).ToString.Contains("PRIV") Or drC(0).ToString.Contains("CUASI") Then
                        drResumen("GRUPO") = "PRIVADOS"
                    ElseIf drC(0).ToString.Contains("N30") Or drC(0).ToString.Contains("BREMS") Or drC(0).ToString.Contains("BPAS") Or drC(0).ToString.Contains("TIIE") Then
                        drResumen("GRUPO") = "REV30"
                    ElseIf drC(0).ToString.Contains("CASH") Or drC(0).ToString.Contains("CHEQUERA") Then
                        drResumen("GRUPO") = "CASH"
                    Else
                        drResumen("GRUPO") = drC(0)
                    End If
                Else
                    drResumen("SUBGRUPO") = ""
                    drResumen("GRUPO") = ""
                End If

                drResumen("FONDO") = drC(1)
                drResumen("INSTRUMENTO") = drC(3)

                If IsDBNull(drC(2)) Then
                    drResumen("CONTRIBUCION") = 0
                Else
                    drResumen("CONTRIBUCION") = drC(2)
                End If

                Dim strFondoAuxiliar As String = drC(1)
                Dim c = (From dato In dtContribuciones.AsEnumerable() Where dato.Field(Of String)("FondoBench") = strFondoAuxiliar Select dato.Field(Of Double)("Contribucion")).FirstOrDefault 'drC(1) Select dato.Field(Of Double)("Contribucion")).FirstOrDefault

                drResumen("ACTIVO") = c
                drResumen("PORCACTIVO") = drResumen("CONTRIBUCION") / drResumen("ACTIVO")
                drResumen("DELTA") = 0.0

                dtResumen.Rows.Add(drResumen)
                dtResumen.AcceptChanges()
            Next

            For Each drJ As DataRow In dtJerarquias.Rows
                Dim drResumen As DataRow = dtResumen.NewRow()

                drResumen("NODO") = drJ(0)
                drResumen("PRECIO_SUCIO_24H") = drJ("INSTD_F_FREE5")
                drResumen("DxV") = drJ("AVG_LIFE")
                drResumen("DELTA_REAL") = drJ("DELTA")
                drResumen("NOMINAL") = drJ("NOMINAL_AMT")
                drResumen("TIPOINST") = drJ("INST_TYP")
                drResumen("INST_NUM") = drJ("INST_NUM")
                drResumen("TITULOS") = drJ("POS_QTY")

                If drJ(0).ToString.Length > 0 Then
                    If drJ("POS_TYP") = "REP" Then
                        drResumen("SUBGRUPO") = "REPORTO"
                    Else
                        drResumen("SUBGRUPO") = drJ(0)
                    End If

                    If drResumen("SUBGRUPO").ToString.Contains("CETE") Or drResumen("SUBGRUPO").ToString.Contains("BAN NOM") Then
                        drResumen("GRUPO") = "CUPON CERO"
                    ElseIf drResumen("SUBGRUPO").ToString.Contains("N90") Or drResumen("SUBGRUPO").ToString.Contains("TRI BPA") Then
                        drResumen("GRUPO") = "REV90"
                    ElseIf drResumen("SUBGRUPO").ToString.Contains("EXT") Or drResumen("SUBGRUPO").ToString.Contains("PRIV") Or drResumen("SUBGRUPO").ToString.Contains("CUASI") Then
                        drResumen("GRUPO") = "PRIVADOS"
                    ElseIf drResumen("SUBGRUPO").ToString.Contains("N30") Or drResumen("SUBGRUPO").ToString.Contains("BREMS") Or drResumen("SUBGRUPO").ToString.Contains("BPAS") Or drResumen("SUBGRUPO").ToString.Contains("TIIE") Then
                        drResumen("GRUPO") = "REV30"
                    ElseIf drResumen("SUBGRUPO").ToString.Contains("CASH") Or drResumen("SUBGRUPO").ToString.Contains("CHEQUERA") Then
                        drResumen("GRUPO") = "CASH"
                    Else
                        drResumen("GRUPO") = drResumen("SUBGRUPO")
                    End If
                Else
                    drResumen("SUBGRUPO") = ""
                    drResumen("GRUPO") = ""
                End If

                drResumen("FONDO") = drJ(1)
                drResumen("INSTRUMENTO") = drJ(3)

                If IsDBNull(drJ(2)) Then
                    drResumen("CONTRIBUCION") = 0
                Else
                    drResumen("CONTRIBUCION") = drJ(2)
                End If

                Dim strFonAux As String = drJ(1)
                Dim c = (From dato In dtContribuciones.AsEnumerable() Where dato.Field(Of String)("FondoBench") = strFonAux Select dato.Field(Of Double)("Contribucion")).FirstOrDefault 'drJ(1) Select dato.Field(Of Double)("Contribucion")).FirstOrDefault

                drResumen("ACTIVO") = c
                drResumen("PORCACTIVO") = drResumen("CONTRIBUCION") / drResumen("ACTIVO")

                If drJ("POS_TYP") = "NOR" Then
                    If IsDBNull(drJ("DELTA")) Then
                        drResumen("DELTA") = 0.0
                    Else
                        drResumen("DELTA") = drResumen("PORCACTIVO") * drJ("DELTA")
                    End If
                Else
                    drResumen("DELTA") = 0.0
                End If

                dtResumen.Rows.Add(drResumen)
                dtResumen.AcceptChanges()
            Next

            FiltrosVistaComite()

            CreaTabla(Me.cmbVISTA.SelectedIndex, dtResumen)

            dtBusqueda = dtResumen

            CUtileria.CompletarRegBitacora(intBitacoraRefresca)

            tabRebalancing.IsEnabled = False
            tabCompliance.IsEnabled = False

            If dtResumen.Rows.Count > 0 Then

                btnBuscar.IsEnabled = True

                btnPasarModulo.IsEnabled = True

                btnExportar.IsEnabled = True

                grdInformacion.Visibility = System.Windows.Visibility.Visible

                MessageBox.Show("Se refresco la información correctamente", "Refresca Resumen", MessageBoxButton.OK, MessageBoxImage.Information)
            Else
                btnBuscar.IsEnabled = False

                btnPasarModulo.IsEnabled = False

                btnExportar.IsEnabled = False

                grdInformacion.Visibility = System.Windows.Visibility.Hidden

                MessageBox.Show("No hay información a mostrar", "Refresca Resumen", MessageBoxButton.OK, MessageBoxImage.Information)
            End If
        Catch ex As Exception
            Dim intBitacoraErrorResumen As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "Refresca Resumen", ex.Message)
            CUtileria.CompletarRegBitacora(intBitacoraErrorResumen)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Refrescar resumen", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub grdInformacion_LayoutUpdated(sender As System.Object, e As System.EventArgs) Handles grdInformacion.LayoutUpdated
        Mouse.OverrideCursor = Cursors.Arrow
    End Sub
#End Region

#Region "Cambio Vista"
    Private Sub cmbVISTA_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles cmbVISTA.SelectionChanged
        Try
            Select Case cmbVISTA.SelectedIndex
                Case 0
                    Me.brdInstrumento.Visibility = System.Windows.Visibility.Hidden
                Case 1
                    Me.brdInstrumento.Visibility = System.Windows.Visibility.Visible

                    If dtResumen.Rows.Count > 0 Then

                        Dim rwInstrumentos() As DataRow

                        rwInstrumentos = dtResumen.DefaultView.ToTable(True, "INSTRUMENTO").Select("", "INSTRUMENTO ASC")
                        Dim lstInstrumentos = New List(Of CInstrumentoReporting)(From r In rwInstrumentos.CopyToDataTable().AsEnumerable() Select (CreaInstrumentoReporting(r)))

                        lsvInstrumentos.ItemsSource = Nothing
                        lsvInstrumentos.Items.Refresh()
                        lsvInstrumentos.ItemsSource = lstInstrumentos
                        lsvInstrumentos.Items.Refresh()

                        txtInstrumento.Text = String.Empty

                        chkInstrumento.IsChecked = True
                    End If
            End Select

            RealizaBusqueda()
        Catch ex As Exception

        End Try
    End Sub
#End Region

#Region "Agrupa información"
    Private Function CreaGrupo(ByVal dr As DataRow) As CGrupo
        Dim g As CGrupo = New CGrupo()
        g.Nombre = dr("GRUPO")
        g.Seleccionado = True
        Return g
    End Function

    Private Function CreaSubgrupo(ByVal dr As DataRow) As CSubgrupo
        Dim g As CSubgrupo = New CSubgrupo()
        g.Nombre = dr("SUBGRUPO")
        g.Seleccionado = True
        Return g
    End Function

    Private Function CreaFondoReporting(ByVal dr As DataRow) As CFondoReporting
        Dim g As CFondoReporting = New CFondoReporting()
        g.Nombre = dr("FONDO")
        g.Seleccionado = True
        Return g
    End Function

    Private Function CreaInstrumentoReporting(ByVal dr As DataRow) As CInstrumentoReporting
        Dim g As CInstrumentoReporting = New CInstrumentoReporting()
        g.Nombre = dr("INSTRUMENTO")
        g.Seleccionado = True
        Return g
    End Function

    Private Sub FiltrosVistaComite()
        Dim rwGrupos() As DataRow, rwSubgrupos() As DataRow, rwFondos() As DataRow

        rwGrupos = dtResumen.DefaultView.ToTable(True, "GRUPO").Select("", "GRUPO ASC")
        Dim lstGrupos = New List(Of CGrupo)(From r In rwGrupos.CopyToDataTable().AsEnumerable() Select (CreaGrupo(r)))

        rwSubgrupos = dtResumen.DefaultView.ToTable(True, "SUBGRUPO").Select("", "SUBGRUPO ASC")
        Dim lstSubGrupos = New List(Of CSubgrupo)(From r In rwSubgrupos.CopyToDataTable().AsEnumerable() Select (CreaSubgrupo(r)))

        rwFondos = dtResumen.DefaultView.ToTable(True, "FONDO").Select("", "FONDO ASC")
        Dim lstFondos = New List(Of CFondoReporting)(From r In rwFondos.CopyToDataTable().AsEnumerable() Select (CreaFondoReporting(r)))

        lsvGrupos.ItemsSource = Nothing
        lsvGrupos.Items.Refresh()
        lsvGrupos.ItemsSource = lstGrupos
        lsvGrupos.Items.Refresh()

        lsvSubgrupos.ItemsSource = Nothing
        lsvSubgrupos.Items.Refresh()
        lsvSubgrupos.ItemsSource = lstSubGrupos
        lsvSubgrupos.Items.Refresh()

        lsvFondos.ItemsSource = Nothing
        lsvFondos.Items.Refresh()
        lsvFondos.ItemsSource = lstFondos
        lsvFondos.Items.Refresh()

        chkGrupo.IsChecked = True
        chkSubgrupo.IsChecked = True
        chkFondo.IsChecked = True

        txtGrupo.Text = String.Empty
        txtSubgrupo.Text = String.Empty
        txtFondo.Text = String.Empty
        txtInstrumento.Text = String.Empty

        If (cmbVISTA.SelectedIndex = 1) Then
            Dim rwInstrumentos() As DataRow

            rwInstrumentos = dtResumen.DefaultView.ToTable(True, "INSTRUMENTO").Select("", "INSTRUMENTO ASC")
            Dim lstInstrumentos = New List(Of CInstrumentoReporting)(From r In rwInstrumentos.CopyToDataTable().AsEnumerable() Select (CreaInstrumentoReporting(r)))

            lsvInstrumentos.ItemsSource = Nothing
            lsvInstrumentos.Items.Refresh()
            lsvInstrumentos.ItemsSource = lstInstrumentos
            lsvInstrumentos.Items.Refresh()

            chkInstrumento.IsChecked = True
        End If

    End Sub

    Private Sub CreaTabla(ByVal Opcion As Integer, ByVal dtAuxiliar As System.Data.DataTable)
        Dim dtInformacion As New System.Data.DataTable()
        Dim rwFondosCol() As DataRow

        rwFondosCol = dtAuxiliar.DefaultView.ToTable(True, "FONDO").Select("", "FONDO ASC")

        If (Opcion = 0) Then
            dtInformacion.Columns.Add("GRUPO")
            dtInformacion.Columns.Add("SUBGRUPO")
            dtInformacion.Columns.Add("INSTRUMENTO")

            For Each drAux As DataRow In rwFondosCol
                dtInformacion.Columns.Add(drAux(0) + " %")
            Next

            For Each drAux As DataRow In rwFondosCol
                dtInformacion.Columns.Add(drAux(0))
            Next

            Dim llave = From r In dtAuxiliar Group r By Grupo = r.Field(Of String)("GRUPO"), Subgrupo = r.Field(Of String)("SUBGRUPO"), Instrumento = r.Field(Of String)("INSTRUMENTO") Into GrupoLLave = Group Order By Grupo, Subgrupo, Instrumento
                        Select New With
                        {
                            Key Grupo,
                            Key Subgrupo,
                            Key Instrumento
                        }

            For Each Y In llave
                Dim drInf As DataRow = dtInformacion.NewRow()
                drInf(0) = Y.Grupo
                drInf(1) = Y.Subgrupo
                drInf(2) = Y.Instrumento

                dtInformacion.Rows.Add(drInf)
                dtInformacion.AcceptChanges()
            Next

            Dim query = From row In dtAuxiliar Group row By Grupo = row.Field(Of String)("GRUPO"), Subgrupo = row.Field(Of String)("SUBGRUPO"), Instrumento = row.Field(Of String)("INSTRUMENTO"), Fondo = row.Field(Of String)("FONDO")
                    Into PrimerGrupo = Group Order By Grupo, Subgrupo, Instrumento, Fondo
            Select New With
            {
                Key Grupo,
                Key Subgrupo,
                Key Instrumento,
                Key Fondo,
                .PorcActivo = PrimerGrupo.Sum(Function(r) r.Field(Of Double)("PORCACTIVO")),
                .Delta = PrimerGrupo.Sum(Function(r) r.Field(Of Double)("DELTA"))
            }

            For Each X In query
                For Each drTemp As DataRow In dtInformacion.Rows
                    If drTemp("GRUPO") = X.Grupo And drTemp("SUBGRUPO") = X.Subgrupo And drTemp("INSTRUMENTO") = X.Instrumento Then

                        drTemp(X.Fondo + " %") = (X.PorcActivo * 100).ToString("###,##0.00") + " %"
                        drTemp(X.Fondo) = X.Delta.ToString("###,##0.00")
                    End If
                Next
            Next

            Dim icvAgrupadoDatos As ICollectionView

            icvAgrupadoDatos = CollectionViewSource.GetDefaultView(dtInformacion)
            icvAgrupadoDatos.GroupDescriptions.Add(New PropertyGroupDescription("GRUPO"))
            icvAgrupadoDatos.GroupDescriptions.Add(New PropertyGroupDescription("SUBGRUPO"))

            LimpiaGrid()
            grdInformacion.ItemsSource = icvAgrupadoDatos
            grdInformacion.Items.Refresh()
            grdInformacion.FrozenColumnCount = 3
            grdInformacion.Visibility = System.Windows.Visibility.Visible

        ElseIf (Opcion = 1) Then
            dtInformacion.Columns.Add("INSTRUMENTO")
            dtInformacion.Columns.Add("GRUPO")
            dtInformacion.Columns.Add("SUBGRUPO")

            For Each drAux As DataRow In rwFondosCol
                dtInformacion.Columns.Add(drAux(0) + " %")
            Next

            For Each drAux As DataRow In rwFondosCol
                dtInformacion.Columns.Add(drAux(0))
            Next

            Dim llaveIns = From r In dtAuxiliar Group r By Instrumento = r.Field(Of String)("INSTRUMENTO"), Grupo = r.Field(Of String)("GRUPO"), Subgrupo = r.Field(Of String)("SUBGRUPO") Into GrupoLLave = Group Order By Instrumento, Grupo, Subgrupo
                        Select New With
                        {
                            Key Instrumento,
                            Key Grupo,
                            Key Subgrupo
                        }

            For Each Y In llaveIns
                Dim drInf As DataRow = dtInformacion.NewRow()
                drInf(0) = Y.Instrumento
                drInf(1) = Y.Grupo
                drInf(2) = Y.Subgrupo

                dtInformacion.Rows.Add(drInf)
                dtInformacion.AcceptChanges()
            Next

            Dim queryIns = From row In dtAuxiliar Group row By Instrumento = row.Field(Of String)("INSTRUMENTO"), Grupo = row.Field(Of String)("GRUPO"), Subgrupo = row.Field(Of String)("SUBGRUPO"), Fondo = row.Field(Of String)("FONDO")
                    Into PrimerGrupo = Group Order By Instrumento, Grupo, Subgrupo, Fondo
            Select New With
            {
                Key Instrumento,
                Key Grupo,
                Key Subgrupo,
                Key Fondo,
                .PorcActivo = PrimerGrupo.Sum(Function(r) r.Field(Of Double)("PORCACTIVO")),
                .Delta = PrimerGrupo.Sum(Function(r) r.Field(Of Double)("DELTA"))
            }

            For Each X In queryIns
                For Each drTemp As DataRow In dtInformacion.Rows
                    If drTemp("INSTRUMENTO") = X.Instrumento And drTemp("GRUPO") = X.Grupo And drTemp("SUBGRUPO") = X.Subgrupo Then

                        drTemp(X.Fondo + " %") = (X.PorcActivo * 100).ToString("###,##0.00") + " %"
                        drTemp(X.Fondo) = X.Delta.ToString("###,##0.00")
                    End If
                Next
            Next

            Dim icvAgrupadoDatosIns As ICollectionView

            icvAgrupadoDatosIns = CollectionViewSource.GetDefaultView(dtInformacion)
            icvAgrupadoDatosIns.GroupDescriptions.Add(New PropertyGroupDescription("INSTRUMENTO"))

            LimpiaGrid()
            grdInformacion.ItemsSource = icvAgrupadoDatosIns
            grdInformacion.Items.Refresh()
            grdInformacion.FrozenColumnCount = 3
            grdInformacion.Visibility = System.Windows.Visibility.Visible
        End If
    End Sub

    Private Sub LimpiaGrid()
        grdInformacion.ItemsSource = Nothing
        grdInformacion.Items.Refresh()
    End Sub
#End Region

#Region "Búsqueda"
    Private Sub btnBuscar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnBuscar.Click
        RealizaBusqueda()
    End Sub

    Private Sub RealizaBusqueda()
        Try
            Mouse.OverrideCursor = Cursors.Wait

            dtBusqueda = New System.Data.DataTable()
            Dim rwBusqueda() As DataRow
            Dim filtroGrupos As String = String.Empty, filtroSubGrupos As String = String.Empty, filtroFondos As String = String.Empty, filtroInstrumentos As String = String.Empty,
                Condicion As String = String.Empty

            For Each cgr As CGrupo In lsvGrupos.Items
                If cgr.Seleccionado Then
                    filtroGrupos = filtroGrupos + "'" + cgr.Nombre + "',"
                End If
            Next

            If filtroGrupos.Length > 0 Then
                filtroGrupos = filtroGrupos.Substring(0, filtroGrupos.Length - 1)
                filtroGrupos = "GRUPO IN (" + filtroGrupos + ")"
            Else
                filtroGrupos = "GRUPO = ''"
            End If

            For Each sgr As CSubgrupo In lsvSubgrupos.Items
                If sgr.Seleccionado Then
                    filtroSubGrupos = filtroSubGrupos + "'" + sgr.Nombre + "',"
                End If
            Next

            If filtroSubGrupos.Length > 0 Then
                filtroSubGrupos = filtroSubGrupos.Substring(0, filtroSubGrupos.Length - 1)
                filtroSubGrupos = "SUBGRUPO IN (" + filtroSubGrupos + ")"
            Else
                filtroSubGrupos = "SUBGRUPO = ''"
            End If

            For Each cfr As CFondoReporting In lsvFondos.Items
                If cfr.Seleccionado Then
                    filtroFondos = filtroFondos + "'" + cfr.Nombre + "',"
                End If
            Next

            If filtroFondos.Length > 0 Then
                filtroFondos = filtroFondos.Substring(0, filtroFondos.Length - 1)
                filtroFondos = "FONDO IN (" + filtroFondos + ")"
            Else
                filtroFondos = "FONDO = ''"
            End If

            If cmbVISTA.SelectedIndex = 1 Then
                For Each cir As CInstrumentoReporting In lsvInstrumentos.Items
                    If cir.Seleccionado Then
                        filtroInstrumentos = filtroInstrumentos + "'" + cir.Nombre + "',"
                    End If
                Next

                If filtroInstrumentos.Length > 0 Then
                    filtroInstrumentos = filtroInstrumentos.Substring(0, filtroInstrumentos.Length - 1)
                    filtroInstrumentos = "INSTRUMENTO IN (" + filtroInstrumentos + ")"
                Else
                    filtroInstrumentos = "INSTRUMENTO = ''"
                End If

                Condicion = filtroGrupos + " AND " + filtroSubGrupos + " AND " + filtroFondos + " AND " + filtroInstrumentos

                rwBusqueda = dtResumen.Select(Condicion)

                If rwBusqueda.Count > 0 Then
                    dtBusqueda = rwBusqueda.CopyToDataTable

                    CreaTabla(1, dtBusqueda)

                    btnPasarModulo.IsEnabled = True
                    btnExportar.IsEnabled = True

                    grdInformacion.Visibility = System.Windows.Visibility.Visible

                    Mouse.OverrideCursor = Cursors.Arrow
                Else
                    btnPasarModulo.IsEnabled = False
                    btnExportar.IsEnabled = False

                    LimpiaGrid()

                    grdInformacion.Visibility = System.Windows.Visibility.Hidden

                    Mouse.OverrideCursor = Cursors.Arrow

                    MessageBox.Show("No hay resultados con los filtros aplicados", "Realiza búsqueda", MessageBoxButton.OK, MessageBoxImage.Warning)
                End If
            Else
                Condicion = filtroGrupos + " AND " + filtroSubGrupos + " AND " + filtroFondos

                rwBusqueda = dtResumen.Select(Condicion)

                tabRebalancing.IsEnabled = False
                tabCompliance.IsEnabled = False

                If rwBusqueda.Count > 0 Then
                    dtBusqueda = rwBusqueda.CopyToDataTable

                    CreaTabla(0, dtBusqueda)

                    btnPasarModulo.IsEnabled = True
                    btnExportar.IsEnabled = True

                    grdInformacion.Visibility = System.Windows.Visibility.Visible

                    Mouse.OverrideCursor = Cursors.Arrow
                Else
                    btnPasarModulo.IsEnabled = False
                    btnExportar.IsEnabled = False

                    LimpiaGrid()

                    grdInformacion.Visibility = System.Windows.Visibility.Hidden

                    Mouse.OverrideCursor = Cursors.Arrow

                    MessageBox.Show("No hay resultados con los filtros aplicados", "Realiza búsqueda", MessageBoxButton.OK, MessageBoxImage.Warning)
                End If
            End If
        Catch ex As Exception
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Realiza búsqueda", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub chkGrupo_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles chkGrupo.Click
        If chkGrupo.IsChecked Then
            For Each drG As CGrupo In lsvGrupos.Items
                drG.Seleccionado = True
            Next
        Else
            For Each drG As CGrupo In lsvGrupos.Items
                drG.Seleccionado = False
            Next
        End If

        lsvGrupos.Items.Refresh()
    End Sub

    Private Sub chkSubgrupo_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles chkSubgrupo.Click
        If chkSubgrupo.IsChecked Then
            For Each drS As CSubgrupo In lsvSubgrupos.Items
                drS.Seleccionado = True
            Next
        Else
            For Each drS As CSubgrupo In lsvSubgrupos.Items
                drS.Seleccionado = False
            Next
        End If

        lsvSubgrupos.Items.Refresh()
    End Sub

    Private Sub chkFondo_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles chkFondo.Click
        If chkFondo.IsChecked Then
            For Each drFR As CFondoReporting In lsvFondos.Items
                drFR.Seleccionado = True
            Next
        Else
            For Each drFR As CFondoReporting In lsvFondos.Items
                drFR.Seleccionado = False
            Next
        End If

        lsvFondos.Items.Refresh()
    End Sub

    Private Sub chkInstrumento_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles chkInstrumento.Click
        If chkInstrumento.IsChecked Then
            For Each drIR As CInstrumentoReporting In lsvInstrumentos.Items
                drIR.Seleccionado = True
            Next
        Else
            For Each drIR As CInstrumentoReporting In lsvInstrumentos.Items
                drIR.Seleccionado = False
            Next
        End If

        lsvInstrumentos.Items.Refresh()
    End Sub

    Private Sub txtGrupo_TextChanged(sender As System.Object, e As System.Windows.Controls.TextChangedEventArgs) Handles txtGrupo.TextChanged
        If dtResumen.Rows.Count > 0 Then
            lsvGrupos.ItemsSource = Nothing
            lsvGrupos.Items.Refresh()
            Dim rwGrupos() As DataRow

            chkGrupo.IsChecked = True

            If txtGrupo.Text = String.Empty Then
                rwGrupos = dtResumen.DefaultView.ToTable(True, "GRUPO").Select("", "GRUPO ASC")
                Dim lstGrupos = New List(Of CGrupo)(From r In rwGrupos.CopyToDataTable().AsEnumerable() Select (CreaGrupo(r)))

                lsvGrupos.ItemsSource = lstGrupos
                lsvGrupos.Items.Refresh()
            Else
                rwGrupos = dtResumen.DefaultView.ToTable(True, "GRUPO").Select("GRUPO LIKE '%" & txtGrupo.Text & "%'", "GRUPO ASC")

                If rwGrupos.Count > 0 Then
                    Dim lstGrupos = New List(Of CGrupo)(From r In rwGrupos.CopyToDataTable().AsEnumerable() Select (CreaGrupo(r)))

                    lsvGrupos.ItemsSource = lstGrupos
                    lsvGrupos.Items.Refresh()
                End If
            End If
        End If
    End Sub

    Private Sub txtSubgrupo_TextChanged(sender As System.Object, e As System.Windows.Controls.TextChangedEventArgs) Handles txtSubgrupo.TextChanged
        If dtResumen.Rows.Count > 0 Then
            lsvSubgrupos.ItemsSource = Nothing
            lsvSubgrupos.Items.Refresh()
            Dim rwSubgrupos() As DataRow

            chkSubgrupo.IsChecked = True

            If txtSubgrupo.Text = String.Empty Then
                rwSubgrupos = dtResumen.DefaultView.ToTable(True, "SUBGRUPO").Select("", "SUBGRUPO ASC")
                Dim lstSubGrupos = New List(Of CSubgrupo)(From r In rwSubgrupos.CopyToDataTable().AsEnumerable() Select (CreaSubgrupo(r)))

                lsvSubgrupos.ItemsSource = lstSubGrupos
                lsvSubgrupos.Items.Refresh()
            Else
                rwSubgrupos = dtResumen.DefaultView.ToTable(True, "SUBGRUPO").Select("SUBGRUPO LIKE '%" & txtSubgrupo.Text & "%'", "SUBGRUPO ASC")

                If rwSubgrupos.Count > 0 Then
                    Dim lstSubGrupos = New List(Of CSubgrupo)(From r In rwSubgrupos.CopyToDataTable().AsEnumerable() Select (CreaSubgrupo(r)))

                    lsvSubgrupos.ItemsSource = lstSubGrupos
                    lsvSubgrupos.Items.Refresh()
                End If
            End If
        End If
    End Sub

    Private Sub txtFondo_TextChanged(sender As System.Object, e As System.Windows.Controls.TextChangedEventArgs) Handles txtFondo.TextChanged
        If dtResumen.Rows.Count > 0 Then
            lsvFondos.ItemsSource = Nothing
            lsvFondos.Items.Refresh()
            Dim rwFondos() As DataRow

            chkFondo.IsChecked = True

            If txtFondo.Text = String.Empty Then
                rwFondos = dtResumen.DefaultView.ToTable(True, "FONDO").Select("", "FONDO ASC")
                Dim lstFondos = New List(Of CFondoReporting)(From r In rwFondos.CopyToDataTable().AsEnumerable() Select (CreaFondoReporting(r)))

                lsvFondos.ItemsSource = lstFondos
                lsvFondos.Items.Refresh()
            Else
                rwFondos = dtResumen.DefaultView.ToTable(True, "FONDO").Select("FONDO LIKE '%" & txtFondo.Text & "%'", "FONDO ASC")

                If rwFondos.Count > 0 Then
                    Dim lstFondos = New List(Of CFondoReporting)(From r In rwFondos.CopyToDataTable().AsEnumerable() Select (CreaFondoReporting(r)))

                    lsvFondos.ItemsSource = lstFondos
                    lsvFondos.Items.Refresh()
                End If
            End If
        End If
    End Sub

    Private Sub txtInstrumento_TextChanged(sender As System.Object, e As System.Windows.Controls.TextChangedEventArgs) Handles txtInstrumento.TextChanged
        If dtResumen.Rows.Count > 0 Then
            lsvInstrumentos.ItemsSource = Nothing
            lsvInstrumentos.Items.Refresh()
            Dim rwInstrumentos() As DataRow

            chkInstrumento.IsChecked = True

            If txtInstrumento.Text = String.Empty Then
                rwInstrumentos = dtResumen.DefaultView.ToTable(True, "INSTRUMENTO").Select("", "INSTRUMENTO ASC")
                Dim lstInstrumentos = New List(Of CInstrumentoReporting)(From r In rwInstrumentos.CopyToDataTable().AsEnumerable() Select (CreaInstrumentoReporting(r)))

                lsvInstrumentos.ItemsSource = lstInstrumentos
                lsvInstrumentos.Items.Refresh()
            Else
                rwInstrumentos = dtResumen.DefaultView.ToTable(True, "INSTRUMENTO").Select("INSTRUMENTO LIKE '%" & txtInstrumento.Text & "%'", "INSTRUMENTO ASC")

                If rwInstrumentos.Count > 0 Then
                    Dim lstInstrumentos = New List(Of CInstrumentoReporting)(From r In rwInstrumentos.CopyToDataTable().AsEnumerable() Select (CreaInstrumentoReporting(r)))

                    lsvInstrumentos.ItemsSource = lstInstrumentos
                    lsvInstrumentos.Items.Refresh()
                End If
            End If
        End If
    End Sub
#End Region

#Region "Búsqueda VALMER"
    Private Sub chkTV_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles chkTV.Click
        If chkTV.IsChecked Then
            For Each drTV As CTipoValor In lsvTV.Items
                drTV.Seleccionado = True
            Next
        Else
            For Each drTV As CTipoValor In lsvTV.Items
                drTV.Seleccionado = False
            Next
        End If

        lsvTV.Items.Refresh()
    End Sub

    Private Sub chkEmisora_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles chkEmisora.Click
        If chkEmisora.IsChecked Then
            For Each drE As CEmisora In lsvEmisora.Items
                drE.Seleccionado = True
            Next
        Else
            For Each drE As CEmisora In lsvEmisora.Items
                drE.Seleccionado = False
            Next
        End If

        lsvEmisora.Items.Refresh()
    End Sub

    Private Sub chkSerie_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles chkSerie.Click
        If chkSerie.IsChecked Then
            For Each drS As CSerie In lsvSerie.Items
                drS.Seleccionado = True
            Next
        Else
            For Each drS As CSerie In lsvSerie.Items
                drS.Seleccionado = False
            Next
        End If

        lsvSerie.Items.Refresh()
    End Sub

    Private Sub txtTV_TextChanged(sender As System.Object, e As System.Windows.Controls.TextChangedEventArgs) Handles txtTV.TextChanged
        If dtValmer.Rows.Count > 0 Then
            lsvTV.ItemsSource = Nothing
            lsvTV.Items.Refresh()
            Dim rwTV() As DataRow

            chkTV.IsChecked = True

            If txtTV.Text = String.Empty Then
                rwTV = dtValmer.DefaultView.ToTable(True, "TV").Select("", "TV ASC")
                Dim lstTV = New List(Of CTipoValor)(From r In rwTV.CopyToDataTable().AsEnumerable() Select (CreaTV(r)))

                lsvTV.ItemsSource = lstTV
                lsvTV.UpdateLayout()
            Else
                rwTV = dtValmer.DefaultView.ToTable(True, "TV").Select("TV LIKE '%" & txtTV.Text & "%'", "TV ASC")

                If rwTV.Count > 0 Then
                    Dim lstTV = New List(Of CTipoValor)(From r In rwTV.CopyToDataTable().AsEnumerable() Select (CreaTV(r)))

                    lsvTV.ItemsSource = lstTV
                    lsvTV.UpdateLayout()
                End If
            End If
        End If
    End Sub

    Private Sub txtEmisora_TextChanged(sender As System.Object, e As System.Windows.Controls.TextChangedEventArgs) Handles txtEmisora.TextChanged
        If dtValmer.Rows.Count > 0 Then
            lsvEmisora.ItemsSource = Nothing
            lsvEmisora.Items.Refresh()
            Dim rwEmisoras() As DataRow

            chkEmisora.IsChecked = True

            If txtEmisora.Text = String.Empty Then
                rwEmisoras = dtValmer.DefaultView.ToTable(True, "EMISORA").Select("", "EMISORA ASC")
                Dim lstEmisoras = New List(Of CEmisora)(From r In rwEmisoras.CopyToDataTable().AsEnumerable() Select (CreaEmisora(r)))

                lsvEmisora.ItemsSource = lstEmisoras
                lsvEmisora.UpdateLayout()
            Else
                rwEmisoras = dtValmer.DefaultView.ToTable(True, "EMISORA").Select("EMISORA LIKE '%" & txtEmisora.Text & "%'", "EMISORA ASC")

                If rwEmisoras.Count > 0 Then
                    Dim lstEmisoras = New List(Of CEmisora)(From r In rwEmisoras.CopyToDataTable().AsEnumerable() Select (CreaEmisora(r)))

                    lsvEmisora.ItemsSource = lstEmisoras
                    lsvEmisora.UpdateLayout()
                End If
            End If
        End If
    End Sub

    Private Sub txtSerie_TextChanged(sender As System.Object, e As System.Windows.Controls.TextChangedEventArgs) Handles txtSerie.TextChanged
        If dtValmer.Rows.Count > 0 Then
            lsvSerie.ItemsSource = Nothing
            lsvSerie.Items.Refresh()
            Dim rwSeries() As DataRow

            chkSerie.IsChecked = True

            If txtSerie.Text = String.Empty Then
                rwSeries = dtValmer.DefaultView.ToTable(True, "SERIE").Select("", "SERIE ASC")
                Dim lstSeries = New List(Of CSerie)(From r In rwSeries.CopyToDataTable().AsEnumerable() Select (CreaSerie(r)))

                lsvSerie.ItemsSource = lstSeries
                lsvSerie.UpdateLayout()
            Else
                rwSeries = dtValmer.DefaultView.ToTable(True, "SERIE").Select("SERIE LIKE '%" & txtSerie.Text & "%'", "SERIE ASC")

                If rwSeries.Count > 0 Then
                    Dim lstSeries = New List(Of CSerie)(From r In rwSeries.CopyToDataTable().AsEnumerable() Select (CreaSerie(r)))

                    lsvSerie.ItemsSource = lstSeries
                    lsvSerie.UpdateLayout()
                End If
            End If
        End If
    End Sub

    Private Sub btnBuscarVALMER_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnBuscarVALMER.Click
        Try
            Mouse.OverrideCursor = Cursors.Wait

            Dim dtBusquedaVALMER As New System.Data.DataTable()
            Dim rwBusqueda() As DataRow

            Dim filtroTV As String = String.Empty, filtroEmisoras As String = String.Empty, filtroSeries As String = String.Empty, Condicion As String = String.Empty

            For Each ctv As CTipoValor In lsvTV.Items
                If ctv.Seleccionado Then
                    filtroTV = filtroTV + "'" + ctv.Nombre + "',"
                End If
            Next

            If filtroTV.Length > 0 Then
                filtroTV = filtroTV.Substring(0, filtroTV.Length - 1)
                filtroTV = "TV IN (" + filtroTV + ")"
            Else
                filtroTV = "TV = ''"
            End If

            For Each cem As CEmisora In lsvEmisora.Items
                If cem.Seleccionado Then
                    filtroEmisoras = filtroEmisoras + "'" + cem.Nombre + "',"
                End If
            Next

            If filtroEmisoras.Length > 0 Then
                filtroEmisoras = filtroEmisoras.Substring(0, filtroEmisoras.Length - 1)
                filtroEmisoras = "EMISORA IN (" + filtroEmisoras + ")"
            Else
                filtroEmisoras = "EMISORA = ''"
            End If

            For Each cse As CSerie In lsvSerie.Items
                If cse.Seleccionado Then
                    filtroSeries = filtroSeries + "'" + cse.Nombre + "',"
                End If
            Next

            If filtroSeries.Length > 0 Then
                filtroSeries = filtroSeries.Substring(0, filtroSeries.Length - 1)
                filtroSeries = "SERIE IN (" + filtroSeries + ")"
            Else
                filtroSeries = "SERIE = ''"
            End If

            Condicion = filtroTV + " AND " + filtroEmisoras + " AND " + filtroSeries

            rwBusqueda = dtValmer.Select(Condicion)

            If rwBusqueda.Count > 0 Then
                dtBusquedaVALMER = rwBusqueda.CopyToDataTable

                grdVALMER.ItemsSource = dtBusquedaVALMER.DefaultView
                grdVALMER.UpdateLayout()

                grdVALMER.Visibility = System.Windows.Visibility.Visible

                Mouse.OverrideCursor = Cursors.Arrow
            Else                
                grdVALMER.Visibility = System.Windows.Visibility.Hidden

                Mouse.OverrideCursor = Cursors.Arrow

                MessageBox.Show("No hay resultados con los filtros aplicados", "Realiza búsqueda VALMER", MessageBoxButton.OK, MessageBoxImage.Warning)
            End If

            Mouse.OverrideCursor = Cursors.Arrow
        Catch ex As Exception
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Realiza búsqueda VALMER", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region

#Region "Rebalancing"
    Private Sub btnPasarModulo_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnPasarModulo.Click
        Try
            Dim dtPaso As New System.Data.DataTable()
            Mouse.OverrideCursor = Cursors.Wait

            lstRebalancing = New List(Of CRebalancing)
            tabResumen.IsSelected = False
            tabCompliance.IsEnabled = False

            btnBorrarDatos.IsEnabled = True
            btnRefrescar.IsEnabled = True
            btnOrdenes.IsEnabled = True

            dtPaso = dtBusqueda.Select("", "FONDO ASC, GRUPO ASC, SUBGRUPO ASC").CopyToDataTable()

            lstRebalancing = New List(Of CRebalancing)(From R In dtPaso.AsEnumerable() Select (CreaRebalancing(R)))

            Dim icvAgrupadoRebalancing As ICollectionView

            icvAgrupadoRebalancing = CollectionViewSource.GetDefaultView(lstRebalancing)
            icvAgrupadoRebalancing.GroupDescriptions.Add(New PropertyGroupDescription("FONDO"))

            grdRebalancing.ItemsSource = Nothing
            grdRebalancing.Items.Refresh()
            grdRebalancing.ItemsSource = icvAgrupadoRebalancing
            grdRebalancing.Items.Refresh()

            btnOrdenes.IsEnabled = False
            btnExportarTLoader.IsEnabled = False
            grdAuxiliar.ItemsSource = Nothing
            grdAuxiliar.Items.Refresh()

            tabRebalancing.IsSelected = True
            tabRebalancing.IsEnabled = True
        Catch ex As Exception
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Módulo rebalancing", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub grdAuxiliar_LayoutUpdated(sender As System.Object, e As System.EventArgs) Handles grdAuxiliar.LayoutUpdated
        Mouse.OverrideCursor = Cursors.Arrow
    End Sub

    Private Sub grdRebalancing_LayoutUpdated(sender As System.Object, e As System.EventArgs) Handles grdRebalancing.LayoutUpdated
        Mouse.OverrideCursor = Cursors.Arrow
    End Sub

    Private Function CreaRebalancing(ByVal dr As DataRow) As CRebalancing
        Dim crAux As CRebalancing = New CRebalancing()

        crAux.FONDO = dr("FONDO")
        crAux.GRUPO = dr("GRUPO")
        crAux.SUBGRUPO = dr("SUBGRUPO")
        crAux.INSTRUMENTO = dr("INSTRUMENTO")

        If (IsDBNull(dr("PRECIO_SUCIO_24H"))) Then
            crAux.PRECIO_SUCIO_24H = ""
        Else
            crAux.PRECIO_SUCIO_24H = dr("PRECIO_SUCIO_24H")
        End If

        If (IsDBNull(dr("DxV"))) Then
            crAux.DxV = ""
        Else
            crAux.DxV = dr("DxV")
        End If

        If (IsDBNull(dr("DELTA_REAL"))) Then
            crAux.DELTA_REAL = ""
        Else
            crAux.DELTA_REAL = dr("DELTA_REAL")
        End If

        If (IsDBNull(dr("NOMINAL"))) Then
            crAux.NOMINAL = ""
        Else
            crAux.NOMINAL = dr("NOMINAL")
        End If

        If (IsDBNull(dr("TIPOINST"))) Then
            crAux.TIPOINST = ""
        Else
            crAux.TIPOINST = dr("TIPOINST")
        End If

        If (IsDBNull(dr("INST_NUM"))) Then
            crAux.INST_NUM = ""
        Else
            crAux.INST_NUM = dr("INST_NUM")
        End If

        If (IsDBNull(dr("TITULOS"))) Then
            crAux.TITULOS = ""
        Else
            crAux.TITULOS = Convert.ToDouble(dr("TITULOS")).ToString("#,##0.00")
        End If

        If (IsDBNull(dr("PORCACTIVO"))) Then
            crAux.PORCACTIVO = ""
        Else
            crAux.PORCACTIVO = dr("PORCACTIVO")
        End If

        If (IsDBNull(dr("DELTA"))) Then
            crAux.DELTA = ""
        Else
            crAux.DELTA = dr("DELTA")
        End If

        If (IsDBNull(dr("CONTRIBUCION"))) Then
            crAux.CONTRIBUCION = ""
        Else
            crAux.CONTRIBUCION = dr("CONTRIBUCION")
        End If


        Return crAux
    End Function

    Private Sub grdRebalancing_BeginningEdit(sender As System.Object, e As System.Windows.Controls.DataGridBeginningEditEventArgs) Handles grdRebalancing.BeginningEdit
        Try
            crElegido = grdRebalancing.CurrentItem
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Edición rebalancing", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub grdRebalancing_CellEditEnding(sender As System.Object, e As System.Windows.Controls.DataGridCellEditEndingEventArgs) Handles grdRebalancing.CellEditEnding
        Try
            Dim crActual As New CRebalancing()
            Dim txtContenidoCelda As Object

            Select Case e.EditAction
                Case DataGridEditAction.Commit
                    If Not sender.CurrentItem Is Nothing And Not crElegido Is Nothing Then
                        Dim Columna As Integer = e.Column.DisplayIndex

                        crActual = TryCast(grdRebalancing.CurrentCell.Item, CRebalancing)

                        If crActual.Equals(crElegido) = False Then
                            CType(sender, DataGrid).CancelEdit(DataGridEditingUnit.Cell)
                            Exit Sub
                        End If

                        txtContenidoCelda = sender.Columns(e.Column.DisplayIndex).GetCellContent(sender.CurrentItem)

                        If Columna = 14 Or Columna = 17 Or Columna = 21 Or Columna = 32 Or Columna = 33 Then
                            Try
                                If txtContenidoCelda.Text.ToString.Length > 0 Then
                                    Dim target As Double = Convert.ToDouble(txtContenidoCelda.Text)

                                    If Columna = 14 Then
                                        crElegido.TARGET = (target / 100).ToString("#,##0.00 %")
                                        txtContenidoCelda.Text = (target / 100).ToString("#,##0.00 %")
                                    ElseIf Columna = 17 Then
                                        crElegido.TARGETDELTADESPUES = target.ToString("#,##0.000000")
                                        txtContenidoCelda.Text = target.ToString("#,##0.000000")
                                        crElegido.TARGETDELTADESPUESAUX = target
                                    ElseIf Columna = 21 Then
                                        crElegido.NOMINALESMANUAL = target.ToString("#,##0.00")
                                        txtContenidoCelda.Text = target.ToString("#,##0.00")
                                    ElseIf Columna = 32 Then
                                        crElegido.RANGOINFERIOR = target.ToString("#,##0.00")
                                        txtContenidoCelda.Text = target.ToString("#,##0.00")
                                    ElseIf Columna = 33 Then
                                        crElegido.RANGOSUPERIOR = target.ToString("#,##0.00")
                                        txtContenidoCelda.Text = target.ToString("#,##0.00")
                                    End If
                                Else
                                    If Columna = 14 Then
                                        crElegido.TARGET = ""
                                    ElseIf Columna = 17 Then
                                        crElegido.TARGETDELTADESPUES = ""
                                    ElseIf Columna = 21 Then
                                        crElegido.NOMINALESMANUAL = ""
                                    ElseIf Columna = 32 Then
                                        crElegido.RANGOINFERIOR = ""
                                    ElseIf Columna = 33 Then
                                        crElegido.RANGOSUPERIOR = ""
                                    End If

                                    txtContenidoCelda.Text = ""
                                End If

                                AplicaFormulas()

                                grdRebalancing.UpdateLayout()

                                Dim txtCelda As Object

                                If Columna = 14 And txtContenidoCelda.Text.ToString.Length > 0 Then
                                    CambioTarget()
                                ElseIf Columna = 21 Then
                                    txtCelda = grdRebalancing.Columns(14).GetCellContent(crElegido)

                                    If txtContenidoCelda.Text.ToString.Length > 0 Then
                                        crElegido.TARGET = ((crElegido.PORCACTIVO) + (MontoAux / activoAux)).ToString("#,##0.00 %")
                                        txtCelda.Text = ((crElegido.PORCACTIVO) + (MontoAux / activoAux)).ToString("#,##0.00 %")

                                        AplicaFormulas()

                                        grdRebalancing.UpdateLayout()

                                        CambioTarget()
                                    Else
                                        crElegido.TARGET = ""
                                        txtCelda.Text = ""

                                        AplicaFormulas()

                                        grdRebalancing.UpdateLayout()
                                    End If
                                End If
                            Catch ex As Exception
                                CType(sender, DataGrid).CancelEdit(DataGridEditingUnit.Cell)
                            End Try
                        Else
                            If Columna <> 3 Then
                                If txtContenidoCelda.Text.ToString.Length > 0 Then
                                    If Columna = 29 Then
                                        crElegido.TIPOTRANSACCIONMANUAL = txtContenidoCelda.Text
                                    ElseIf Columna = 38 Then
                                        crElegido.SOBRETASAMANUAL = txtContenidoCelda.Text
                                    End If
                                Else
                                    If Columna = 29 Then
                                        crElegido.TIPOTRANSACCIONMANUAL = ""
                                    ElseIf Columna = 38 Then
                                        crElegido.SOBRETASAMANUAL = ""
                                    End If

                                    txtContenidoCelda.Text = ""
                                End If

                                AplicaFormulas()

                                grdRebalancing.UpdateLayout()
                            Else
                                If Not crElegido.AGREGADO Then
                                    CType(sender, DataGrid).CancelEdit(DataGridEditingUnit.Cell)
                                Else
                                    Dim dtDatos As System.Data.DataTable = ReportingServicio.QueryInstrumentoReporting(txtContenidoCelda.Text)

                                    If Not dtValmer Is Nothing Then
                                        Dim drValmerAux As DataRow() = dtValmer.Select("Instrumento = '" + txtContenidoCelda.Text + "'")

                                        If drValmerAux.Count > 0 Then
                                            crElegido.PRECIO_SUCIO_24H = drValmerAux(0)("PrecioSucio24Hrs")
                                            crElegido.DxV = drValmerAux(0)("DiasPorVencer")
                                        Else
                                            crElegido.PRECIO_SUCIO_24H = "0"
                                            crElegido.DxV = "0"
                                        End If
                                    Else
                                        crElegido.PRECIO_SUCIO_24H = "0"
                                        crElegido.DxV = "0"
                                    End If

                                    If dtDatos.Rows.Count > 0 Then

                                        If IsDBNull(dtDatos.Rows(0)("NOMINAL_AMT")) Then
                                            crElegido.NOMINAL = ""
                                        Else
                                            crElegido.NOMINAL = dtDatos.Rows(0)("NOMINAL_AMT")
                                        End If

                                        If IsDBNull(dtDatos.Rows(0)("INST_TYP")) Then
                                            crElegido.TIPOINST = ""
                                        Else
                                            crElegido.TIPOINST = dtDatos.Rows(0)("INST_TYP")
                                        End If

                                        If IsDBNull(dtDatos.Rows(0)("INST_NUM")) Then
                                            crElegido.INST_NUM = ""
                                        Else
                                            crElegido.INST_NUM = dtDatos.Rows(0)("INST_NUM")
                                        End If

                                        If IsDBNull(dtDatos.Rows(0)("DELTA")) Then
                                            crElegido.DELTA_REAL = ""
                                        Else
                                            crElegido.DELTA_REAL = dtDatos.Rows(0)("DELTA")
                                        End If

                                        crElegido.ERRONEO = False
                                    Else
                                        crElegido.ERRONEO = True

                                        MessageBox.Show("No se encuentra el instrumento en Decalog. Asegurese de que lo ha entrado correctamente o pongase en contacto con administracion de sistemas para que lo den de alta, de lo contrario no se subiran los datos de este instrumento a Decalog ", "Inserción instrumento", MessageBoxButton.OK, MessageBoxImage.Error)
                                    End If

                                    AplicaFormulas()

                                    grdRebalancing.UpdateLayout()
                                End If
                            End If
                        End If
                    End If
            End Select
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Edición rebalancing", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub CambioTarget()
        Dim txtCelda As Object

        txtCelda = grdRebalancing.Columns(17).GetCellContent(crElegido)

        txtCelda.Text = ""
        crElegido.TARGETDELTADESPUES = ""
        crElegido.TARGETDELTADESPUESAUX = 0

        AplicaFormulas()
        grdRebalancing.UpdateLayout()

        If crElegido.DELTA_REAL.Length > 0 Then
            If crElegido.MONTO <> "#N/A" And crElegido.ACTIVOMXN.Length > 0 Then
                crElegido.TARGETDELTADESPUES = (crElegido.DELTA + ((Convert.ToDouble(crElegido.DELTA_REAL) * MontoAux) / activoAux)).ToString("#,##0.000000")
                crElegido.TARGETDELTADESPUESAUX = (crElegido.DELTA + ((Convert.ToDouble(crElegido.DELTA_REAL) * MontoAux) / activoAux))

                txtCelda.Text = crElegido.TARGETDELTADESPUES

                AplicaFormulas()

                grdRebalancing.UpdateLayout()
            End If
        End If

    End Sub

    Private Sub AplicaFormulas()
        Try
            Dim ImpActivoAux As Double
            Dim ImpPorcActivoAux As Double
            Dim TargetAux As Double
            Dim CantidasAux As Double
            Dim NominalesAux As Double

            If crElegido.TARGET.Length > 0 Or crElegido.TARGETDELTADESPUES.Length > 0 Then
                crElegido.FONDOPIVOT = crElegido.FONDO
            Else
                crElegido.FONDOPIVOT = ""
            End If

            If crElegido.FONDOPIVOT.Length > 0 Then
                activoAux = (From dato In dtContribuciones.AsEnumerable() Where dato.Field(Of String)("FondoBench") = crElegido.FONDOPIVOT Select dato.Field(Of Double)("Contribucion")).FirstOrDefault

                crElegido.ACTIVOMXN = activoAux.ToString("#,##0.00")
            Else
                crElegido.ACTIVOMXN = ""
            End If

            If crElegido.INSTRUMENTO.Length > 0 And crElegido.TARGET.Length > 0 And crElegido.TARGETDELTADESPUES.Length = 0 Then
                TargetAux = Convert.ToDouble(crElegido.TARGET.Replace("%", ""))

                If ((TargetAux - crElegido.PORCACTIVO) <> 0) Then
                    crElegido.IMPACTOPORCACTIVO = (TargetAux - (crElegido.PORCACTIVO * 100)).ToString("#,##0.00") + " %"

                    ImpPorcActivoAux = (TargetAux - (crElegido.PORCACTIVO * 100))
                Else
                    crElegido.IMPACTOPORCACTIVO = ""
                End If
            Else
                crElegido.IMPACTOPORCACTIVO = ""
            End If

            If (crElegido.TARGETDELTADESPUES.Length > 0) And (crElegido.PRECIO_SUCIO_24H.Length > 0) And (crElegido.DELTA_REAL.Length > 0) Then
                crElegido.IMPACTOACTIVO = (((((activoAux / Convert.ToDouble(crElegido.DELTA_REAL)) * crElegido.TARGETDELTADESPUESAUX) / activoAux) * 100) - (crElegido.PORCACTIVO * 100)).ToString("#,##0.00") + " %"

                ImpActivoAux = (((((activoAux / Convert.ToDouble(crElegido.DELTA_REAL)) * crElegido.TARGETDELTADESPUESAUX) / activoAux) * 100) - (crElegido.PORCACTIVO * 100))
            Else
                crElegido.IMPACTOACTIVO = ""
            End If

            If crElegido.IMPACTOACTIVO = "NeuN" Then
                crElegido.IMPACTOACTIVO = "#N/A"
            End If

            If crElegido.IMPACTOACTIVO.Length > 0 Then
                crElegido.TARGETDESPUES = (ImpActivoAux + (crElegido.PORCACTIVO * 100)).ToString("#,##0.00") + " %"
            Else
                crElegido.TARGETDESPUES = ""
            End If

            If crElegido.INSTRUMENTO.Length > 0 And crElegido.TARGETDELTADESPUES.Length > 0 Then
                If (crElegido.TARGETDELTADESPUESAUX - crElegido.DELTA) <> 0 Then
                    crElegido.IMPACTODELTA = (crElegido.TARGETDELTADESPUESAUX - crElegido.DELTA).ToString("#,##0.00")
                Else
                    crElegido.IMPACTODELTA = ""
                End If
            Else
                crElegido.IMPACTODELTA = ""
            End If

            If crElegido.NOMINALESMANUAL.Length > 0 Then
                crElegido.NOMINALES = crElegido.NOMINALESMANUAL

                NominalesAux = Convert.ToDouble(crElegido.NOMINALESMANUAL)
            Else
                If (crElegido.PRECIO_SUCIO_24H.Length > 0) And (crElegido.PRECIO_SUCIO_24H <> "0") And (crElegido.IMPACTOPORCACTIVO.Length > 0) Then

                    If crElegido.NOMINAL.Length > 0 And crElegido.NOMINAL <> "0" Then

                        If ImpPorcActivoAux < 0 Then
                            crElegido.NOMINALES = (((ImpPorcActivoAux * activoAux * Convert.ToDouble(crElegido.NOMINAL)) / Convert.ToDouble(crElegido.PRECIO_SUCIO_24H)) / 100).ToString("#,##0.00")

                            NominalesAux = (((ImpPorcActivoAux * activoAux * Convert.ToDouble(crElegido.NOMINAL)) / Convert.ToDouble(crElegido.PRECIO_SUCIO_24H)) / 100)
                        Else
                            Dim datoAux As Double = (((ImpPorcActivoAux * activoAux * Convert.ToDouble(crElegido.NOMINAL)) / Convert.ToDouble(crElegido.PRECIO_SUCIO_24H)) / 100)
                            Dim mult As Double = datoAux Mod crElegido.NOMINAL

                            crElegido.NOMINALES = (datoAux - mult).ToString("#,##0.00")

                            NominalesAux = (datoAux - mult)
                        End If
                    Else
                        crElegido.NOMINALES = "#N/A"
                    End If
                Else
                    If crElegido.NOMINAL.Length > 0 And crElegido.NOMINAL <> "0" Then
                        If crElegido.IMPACTOACTIVO.Length > 0 Then
                            If ImpActivoAux < 0 Then
                                crElegido.NOMINALES = (((ImpActivoAux * activoAux * Convert.ToDouble(crElegido.NOMINAL)) / Convert.ToDouble(crElegido.PRECIO_SUCIO_24H)) / 100).ToString("#,##0.00")

                                NominalesAux = (((ImpActivoAux * activoAux * Convert.ToDouble(crElegido.NOMINAL)) / Convert.ToDouble(crElegido.PRECIO_SUCIO_24H)) / 100)
                            Else
                                Dim datoAux As Double = (((ImpActivoAux * activoAux * Convert.ToDouble(crElegido.NOMINAL)) / Convert.ToDouble(crElegido.PRECIO_SUCIO_24H)) / 100)
                                Dim mult As Double = datoAux Mod crElegido.NOMINAL

                                crElegido.NOMINALES = (datoAux - mult).ToString("#,##0.00")

                                NominalesAux = (datoAux - mult)
                            End If
                        Else
                            crElegido.NOMINALES = ""
                        End If
                    Else
                        crElegido.NOMINALES = "#N/A"
                    End If
                End If
            End If

            If crElegido.NOMINALES = "NeuN" Then
                crElegido.NOMINALES = "#N/A"
            End If

            If crElegido.PRECIO_SUCIO_24H.Length > 0 Then
                If crElegido.NOMINAL.Length > 0 Then
                    If crElegido.NOMINALES.Length > 0 Then
                        If crElegido.NOMINALES <> "#N/A" Then

                            crElegido.CANTIDAD = Math.Round((Convert.ToDouble(crElegido.NOMINALES) / Convert.ToDouble(crElegido.NOMINAL))).ToString("#,##0.00")

                            CantidasAux = Math.Round((Convert.ToDouble(crElegido.NOMINALES) / Convert.ToDouble(crElegido.NOMINAL)))
                        Else
                            crElegido.CANTIDAD = "#N/A"
                        End If
                    Else
                        If (crElegido.NOMINALESMANUAL.Length > 0) Then
                            crElegido.CANTIDAD = Math.Round((Convert.ToDouble(crElegido.NOMINALESMANUAL) / Convert.ToDouble(crElegido.NOMINAL))).ToString("#,##0.00")

                            CantidasAux = Math.Round((Convert.ToDouble(crElegido.NOMINALESMANUAL) / Convert.ToDouble(crElegido.NOMINAL)))
                        Else
                            crElegido.CANTIDAD = ""
                        End If
                    End If
                Else
                    crElegido.CANTIDAD = "#N/A"
                End If
            Else
                crElegido.CANTIDAD = ""
            End If

            If crElegido.CANTIDAD = "NeuN" Then
                crElegido.CANTIDAD = "#N/A"
            End If

            If crElegido.CANTIDAD.Length > 0 Then
                If crElegido.CANTIDAD <> "#N/A" Then
                    If crElegido.TITULOS.Length > 0 Then
                        crElegido.CANTIDADDESPUES = (CantidasAux + Convert.ToDouble(crElegido.TITULOS)).ToString("#,##0.00")
                    Else
                        crElegido.CANTIDADDESPUES = "#N/A"
                    End If
                Else
                    crElegido.CANTIDADDESPUES = "#N/A"
                End If
            Else
                crElegido.CANTIDADDESPUES = ""
            End If

            If crElegido.PRECIO_SUCIO_24H.Length > 0 And crElegido.PRECIO_SUCIO_24H <> "0" Then
                If crElegido.NOMINAL.Length > 0 Then
                    If crElegido.NOMINALES.Length > 0 Then
                        If crElegido.NOMINALES <> "#N/A" Then
                            crElegido.MONTO = ((NominalesAux / Convert.ToDouble(crElegido.NOMINAL)) * Convert.ToDouble(crElegido.PRECIO_SUCIO_24H)).ToString("#,##0.00")

                            MontoAux = ((NominalesAux / Convert.ToDouble(crElegido.NOMINAL)) * Convert.ToDouble(crElegido.PRECIO_SUCIO_24H))
                        Else
                            crElegido.MONTO = "#N/A"
                        End If
                    Else
                        If crElegido.NOMINALESMANUAL.Length > 0 Then
                            crElegido.MONTO = ((Convert.ToDouble(crElegido.NOMINALESMANUAL) / Convert.ToDouble(crElegido.NOMINAL)) * Convert.ToDouble(crElegido.PRECIO_SUCIO_24H)).ToString("#,##0.00")

                            MontoAux = ((Convert.ToDouble(crElegido.NOMINALESMANUAL) / Convert.ToDouble(crElegido.NOMINAL)) * Convert.ToDouble(crElegido.PRECIO_SUCIO_24H))
                        Else
                            crElegido.MONTO = ""
                        End If
                    End If
                Else
                    crElegido.MONTO = "#N/A"
                End If
            Else
                crElegido.MONTO = ""
            End If

            If crElegido.MONTO = "NeuN" Then
                crElegido.MONTO = "#N/A"
            End If

            If crElegido.NOMINALES.Length > 0 Then
                If crElegido.NOMINALES <> "#N/A" Then
                    If NominalesAux < 0 Then
                        crElegido.CV = "V"
                    Else
                        crElegido.CV = "C"
                    End If
                Else
                    crElegido.CV = "#N/A"
                End If
            Else
                crElegido.CV = ""
            End If

            If crElegido.CANTIDAD.Length > 0 Then
                If crElegido.TIPOINST.Length > 0 Then
                    Dim reg() As DataRow

                    reg = dtTiposInstrumentos.Select("ID = " + crElegido.TIPOINST)

                    If reg.Count > 0 Then
                        crElegido.INSTRUMENTOGRP = reg(0)("GRUPO")
                    Else
                        crElegido.INSTRUMENTOGRP = "#N/A"
                    End If
                Else
                    crElegido.INSTRUMENTOGRP = "#N/A"
                End If
            Else
                crElegido.INSTRUMENTOGRP = ""
            End If

            If crElegido.NOMINALES.Length > 0 And crElegido.NOMINALES <> "0" And crElegido.NOMINALES <> "#N/A" And crElegido.PRECIO_SUCIO_24H.Length > 0 Then
                If crElegido.TIPOTRANSACCIONMANUAL.Length = 0 Then
                    If crElegido.INSTRUMENTOGRP = "GU" Or crElegido.INSTRUMENTOGRP = "LD" Then
                        crElegido.TIPOTRANSACCION = crElegido.CV + "DP"
                    Else
                        Dim reg() As DataRow

                        reg = dtTiposInstrumentos.Select("ID = " + crElegido.TIPOINST)

                        If reg.Count > 0 Then
                            crElegido.TIPOTRANSACCION = crElegido.CV + reg(0)("CLASE")
                        Else
                            crElegido.TIPOTRANSACCION = "#N/A"
                        End If
                    End If
                Else
                    crElegido.TIPOTRANSACCION = crElegido.TIPOTRANSACCIONMANUAL
                End If
            Else
                crElegido.TIPOTRANSACCION = ""
            End If

            If crElegido.INST_NUM.Length > 0 And crElegido.NOMINALES.Length > 0 Then
                If crElegido.TIPOTRANSACCION = "VDP" Or crElegido.TIPOTRANSACCION = "CDP" Then
                    If crElegido.TIPOINST.Length > 0 Then
                        If crElegido.TIPOINST = "201" Then
                            crElegido.INSTRUMENTOAUX = "13816"
                        Else
                            If crElegido.INSTRUMENTOGRP <> "#N/A" Then
                                If crElegido.INSTRUMENTOGRP = "GU" Then
                                    crElegido.INSTRUMENTOAUX = "39815"
                                Else
                                    If crElegido.TIPOINST = "262" Or crElegido.TIPOINST = "631" Then
                                        crElegido.INSTRUMENTOAUX = "35419"
                                    Else
                                        crElegido.INSTRUMENTOAUX = ""
                                    End If
                                End If
                            Else
                                crElegido.INSTRUMENTOAUX = "#N/A"
                            End If
                        End If
                    Else
                        crElegido.INSTRUMENTOAUX = "#N/A"
                    End If
                Else
                    crElegido.INSTRUMENTOAUX = crElegido.INST_NUM
                End If
            Else
                crElegido.INSTRUMENTOAUX = ""
            End If

            If crElegido.INST_NUM.Length > 0 And crElegido.NOMINALES.Length > 0 Then
                If crElegido.TIPOTRANSACCION = "VDP" Or crElegido.TIPOTRANSACCION = "CDP" Then
                    crElegido.TVGENERICOS = crElegido.INSTRUMENTO.Substring(0, 2)
                Else
                    crElegido.TVGENERICOS = ""
                End If
            Else
                crElegido.TVGENERICOS = ""
            End If

            If crElegido.INSTRUMENTOAUX.Length > 0 Then
                If crElegido.INSTRUMENTOAUX = "13816" Then
                    crElegido.INSTRUMENTOPIVOT = "DEUDA RANGO LD"
                ElseIf crElegido.INSTRUMENTOAUX = "7686" Then
                    crElegido.INSTRUMENTOPIVOT = "DEUDA RANGO GUBER"
                ElseIf crElegido.INSTRUMENTOAUX = "7687" Then
                    crElegido.INSTRUMENTOPIVOT = "DEUDA RANGO BANCARIO"
                Else
                    crElegido.INSTRUMENTOPIVOT = crElegido.INSTRUMENTO
                End If
            Else
                crElegido.INSTRUMENTOPIVOT = ""
            End If

            If crElegido.TIPOTRANSACCION = "VDP" Or crElegido.TIPOTRANSACCION = "CDP" Then
                If crElegido.RANGOINFERIOR.Length > 0 And crElegido.RANGOSUPERIOR.Length > 0 Then
                    crElegido.RANGOSUPINF = Convert.ToDouble(crElegido.RANGOINFERIOR).ToString + "-" + Convert.ToDouble(crElegido.RANGOSUPERIOR).ToString
                Else
                    crElegido.RANGOSUPINF = ""
                End If
            Else
                crElegido.RANGOSUPINF = ""
            End If

            If crElegido.FONDO.Length > 0 Then
                If crElegido.SOBRETASAMANUAL.Length = 0 Then
                    crElegido.SOBRETASA = "0"
                Else
                    crElegido.SOBRETASA = crElegido.SOBRETASAMANUAL
                End If
            Else
                crElegido.SOBRETASA = ""
            End If
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Edición rebalancing", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub AplicaCambioGrid()
        Dim txtCelda As Object

        txtCelda = grdRebalancing.Columns(15).GetCellContent(crElegido)
        txtCelda.Text = crElegido.IMPACTOPORCACTIVO

        txtCelda = grdRebalancing.Columns(16).GetCellContent(crElegido)
        txtCelda.Text = crElegido.TARGETDESPUES

        txtCelda = grdRebalancing.Columns(18).GetCellContent(crElegido)
        txtCelda.Text = crElegido.IMPACTOACTIVO

        txtCelda = grdRebalancing.Columns(19).GetCellContent(crElegido)
        txtCelda.Text = crElegido.IMPACTODELTA

        txtCelda = grdRebalancing.Columns(20).GetCellContent(crElegido)
        txtCelda.Text = crElegido.NOMINALES

        txtCelda = grdRebalancing.Columns(22).GetCellContent(crElegido)
        txtCelda.Text = crElegido.CANTIDAD

        txtCelda = grdRebalancing.Columns(23).GetCellContent(crElegido)
        txtCelda.Text = crElegido.CANTIDADDESPUES

        txtCelda = grdRebalancing.Columns(24).GetCellContent(crElegido)
        txtCelda.Text = crElegido.MONTO

        txtCelda = grdRebalancing.Columns(25).GetCellContent(crElegido)
        txtCelda.Text = crElegido.FONDOPIVOT

        txtCelda = grdRebalancing.Columns(26).GetCellContent(crElegido)
        txtCelda.Text = crElegido.ACTIVOMXN

        txtCelda = grdRebalancing.Columns(27).GetCellContent(crElegido)
        txtCelda.Text = crElegido.CV

        txtCelda = grdRebalancing.Columns(28).GetCellContent(crElegido)
        txtCelda.Text = crElegido.TIPOTRANSACCION

        txtCelda = grdRebalancing.Columns(30).GetCellContent(crElegido)
        txtCelda.Text = crElegido.INSTRUMENTOAUX

        txtCelda = grdRebalancing.Columns(31).GetCellContent(crElegido)
        txtCelda.Text = crElegido.INSTRUMENTOGRP

        txtCelda = grdRebalancing.Columns(34).GetCellContent(crElegido)
        txtCelda.Text = crElegido.TVGENERICOS

        txtCelda = grdRebalancing.Columns(35).GetCellContent(crElegido)
        txtCelda.Text = crElegido.INSTRUMENTOPIVOT

        txtCelda = grdRebalancing.Columns(36).GetCellContent(crElegido)
        txtCelda.Text = crElegido.RANGOSUPINF

        txtCelda = grdRebalancing.Columns(37).GetCellContent(crElegido)
        txtCelda.Text = crElegido.SOBRETASA
    End Sub

    Private Sub grdRebalancing_PreviewKeyDown(sender As System.Object, e As System.Windows.Input.KeyEventArgs) Handles grdRebalancing.PreviewKeyDown
        Try
            Dim txtContenidoCelda As Object, txtCeldaAux As Object
            Dim icvAgrupadoRebalancing As ICollectionView

            crElegido = grdRebalancing.CurrentItem

            If e.Key = Key.Delete Then
                Dim col As Integer = Me.grdRebalancing.CurrentCell.Column.DisplayIndex

                txtContenidoCelda = sender.Columns(col).GetCellContent(sender.CurrentItem)

                If col = 14 Then
                    crElegido.TARGET = ""
                    txtContenidoCelda.Text = ""
                ElseIf col = 17 Then
                    crElegido.TARGETDELTADESPUES = ""
                    txtContenidoCelda.Text = ""
                ElseIf col = 21 Then
                    crElegido.NOMINALESMANUAL = ""
                    txtContenidoCelda.Text = ""

                    txtCeldaAux = sender.Columns(14).GetCellContent(sender.CurrentItem)

                    txtCeldaAux.Text = ""
                    crElegido.TARGET = ""

                ElseIf col = 29 Then
                    crElegido.TIPOTRANSACCIONMANUAL = ""
                    txtContenidoCelda.Text = ""
                ElseIf col = 32 Then
                    crElegido.RANGOINFERIOR = ""
                    txtContenidoCelda.Text = ""
                ElseIf col = 33 Then
                    crElegido.RANGOSUPERIOR = ""
                    txtContenidoCelda.Text = ""
                ElseIf col = 38 Then
                    crElegido.SOBRETASAMANUAL = ""
                    txtContenidoCelda.Text = ""
                End If

                AplicaFormulas()
                AplicaCambioGrid()

                grdRebalancing.UpdateLayout()
            ElseIf Keyboard.Modifiers = ModifierKeys.Control And e.Key = Key.H Then
                CType(sender, DataGrid).CancelEdit(DataGridEditingUnit.Cell)
                grdRebalancing.CancelEdit()
                grdRebalancing.UnselectAllCells()
                grdRebalancing.UpdateLayout()

                Dim msgResultado As MessageBoxResult = MessageBox.Show("Realmente quiere insertar un nuevo instrumento?", "Insertar instrumento", MessageBoxButton.YesNo, MessageBoxImage.Question)

                If msgResultado = MessageBoxResult.Yes Then

                    Dim crNuevo As New CRebalancing()

                    Mouse.OverrideCursor = Cursors.Wait

                    crNuevo.GRUPO = crElegido.GRUPO
                    crNuevo.SUBGRUPO = crElegido.SUBGRUPO
                    crNuevo.FONDO = crElegido.FONDO
                    crNuevo.INSTRUMENTO = "Introducir tv emisora serie"

                    crNuevo.PRECIO_SUCIO_24H = crElegido.PRECIO_SUCIO_24H
                    crNuevo.DxV = crElegido.DxV
                    crNuevo.DELTA_REAL = crElegido.DELTA_REAL
                    crNuevo.NOMINAL = crElegido.NOMINAL
                    crNuevo.TIPOINST = crElegido.TIPOINST
                    crNuevo.INST_NUM = crElegido.INST_NUM
                    crNuevo.TITULOS = 0
                    crNuevo.PORCACTIVO = Nothing
                    crNuevo.DELTA = Nothing
                    crNuevo.CONTRIBUCION = Nothing
                    crNuevo.AGREGADO = True

                    Try
                        lstRebalancing.Add(crNuevo)

                        icvAgrupadoRebalancing = CollectionViewSource.GetDefaultView(lstRebalancing)
                        icvAgrupadoRebalancing.GroupDescriptions.Clear()
                        icvAgrupadoRebalancing.GroupDescriptions.Add(New PropertyGroupDescription("FONDO"))

                        grdRebalancing.ItemsSource = Nothing
                        grdRebalancing.ItemsSource = icvAgrupadoRebalancing
                        grdRebalancing.UpdateLayout()
                        grdRebalancing.SelectedItem = crNuevo
                        grdRebalancing.ScrollIntoView(crNuevo)
                    Catch ex As Exception
                        lstRebalancing.Remove(crNuevo)

                        Mouse.OverrideCursor = Cursors.Arrow

                        MessageBox.Show("Error TI500. Favor de terminar de editar el registro seleccionado y después proceder con la inserción de uno nuevo. " & ex.Message, "Insertar instrumento", MessageBoxButton.OK, MessageBoxImage.Warning)
                    End Try

                    Mouse.OverrideCursor = Cursors.Arrow
                End If
            ElseIf Keyboard.Modifiers = ModifierKeys.Control And e.Key = Key.J Then
                CType(sender, DataGrid).CancelEdit(DataGridEditingUnit.Cell)
                grdRebalancing.CancelEdit()
                grdRebalancing.UnselectAllCells()
                grdRebalancing.UpdateLayout()

                If crElegido.AGREGADO Then
                    Dim msgBorrado As MessageBoxResult = MessageBox.Show("Realmente quiere borrar la fila?", "Borrar instrumento", MessageBoxButton.YesNo, MessageBoxImage.Question)

                    If msgBorrado = MessageBoxResult.Yes Then
                        Mouse.OverrideCursor = Cursors.Wait
                        Try
                            lstRebalancing.Remove(crElegido)

                            icvAgrupadoRebalancing = CollectionViewSource.GetDefaultView(lstRebalancing)
                            icvAgrupadoRebalancing.GroupDescriptions.Clear()
                            icvAgrupadoRebalancing.GroupDescriptions.Add(New PropertyGroupDescription("FONDO"))

                            grdRebalancing.ItemsSource = Nothing
                            grdRebalancing.ItemsSource = icvAgrupadoRebalancing
                            grdRebalancing.UpdateLayout()
                        Catch ex As Exception
                            lstRebalancing.Add(crElegido)

                            Mouse.OverrideCursor = Cursors.Arrow

                            MessageBox.Show("Error TI500. Favor de terminar de editar el registro seleccionado y después proceder con el borrado. " & ex.Message, "Borrar instrumento", MessageBoxButton.OK, MessageBoxImage.Warning)
                        End Try

                        Mouse.OverrideCursor = Cursors.Arrow
                    End If
                End If
            End If

        Catch ex As Exception
            e.Handled = True

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Modificación rebalancing", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub btnBorrarDatos_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnBorrarDatos.Click
        Mouse.OverrideCursor = Cursors.Wait

        For Each crAuxiliar As CRebalancing In lstRebalancing
            crAuxiliar.TARGET = ""
            crAuxiliar.IMPACTOPORCACTIVO = ""
            crAuxiliar.TARGETDESPUES = ""
            crAuxiliar.TARGETDELTADESPUES = ""
            crAuxiliar.IMPACTOACTIVO = ""
            crAuxiliar.IMPACTODELTA = ""
            crAuxiliar.NOMINALES = ""
            crAuxiliar.NOMINALESMANUAL = ""
            crAuxiliar.CANTIDAD = ""
            crAuxiliar.CANTIDADDESPUES = ""
            crAuxiliar.MONTO = ""
            crAuxiliar.FONDOPIVOT = ""
            crAuxiliar.ACTIVOMXN = ""
            crAuxiliar.CV = ""
            crAuxiliar.TIPOTRANSACCION = ""
            crAuxiliar.TIPOTRANSACCIONMANUAL = ""
            crAuxiliar.INSTRUMENTOAUX = ""
            crAuxiliar.INSTRUMENTOGRP = ""
            crAuxiliar.RANGOINFERIOR = ""
            crAuxiliar.RANGOSUPERIOR = ""
            crAuxiliar.TVGENERICOS = ""
            crAuxiliar.INSTRUMENTOPIVOT = ""
            crAuxiliar.RANGOSUPINF = ""
        Next

        grdRebalancing.Items.Refresh()

        grdAuxiliar.ItemsSource = Nothing
        btnOrdenes.IsEnabled = False
        btnExportarTLoader.IsEnabled = False
        grdAuxiliar.Items.Refresh()

        tabCompliance.IsEnabled = False

        Mouse.OverrideCursor = Cursors.Arrow
    End Sub

    Private Sub btnRefrescar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnRefrescar.Click
        Try
            Mouse.OverrideCursor = Cursors.Wait

            Dim lstAgrupados As IEnumerable(Of CRebalancing)
            Dim lstAuxiliarTemp As New List(Of CRebalancing)

            grdAuxiliar.ItemsSource = Nothing
            grdAuxiliar.Items.Refresh()

            tabCompliance.IsEnabled = False

            'lstAuxiliar = From crAux In lstRebalancing Where crAux.INSTRUMENTOPIVOT.Length > 0 Or crAux.RANGOSUPINF.Length > 0 Or crAux.FONDOPIVOT.Length > 0 Or crAux.INSTRUMENTOAUX.Length > 0 Or crAux.TVGENERICOS.Length > 0 Or (crAux.SOBRETASA.Length > 0 And crAux.SOBRETASAMANUAL.Length > 0) Select crAux Order By crAux.TIPOTRANSACCION, crAux.INSTRUMENTOPIVOT, crAux.RANGOSUPINF
            lstAgrupados = From crAux In lstRebalancing Where crAux.NOMINALES.Length > 0 And crAux.NOMINALES <> "#N/A" And crAux.CANTIDAD.Length > 0 And crAux.CANTIDAD <> "#N/A" And crAux.MONTO.Length > 0 And crAux.MONTO <> "#N/A" And (crAux.INSTRUMENTOPIVOT.Length > 0 Or crAux.RANGOSUPINF.Length > 0 Or crAux.FONDOPIVOT.Length > 0 Or crAux.INSTRUMENTOAUX.Length > 0 Or crAux.TVGENERICOS.Length > 0 Or (crAux.SOBRETASA.Length > 0 And crAux.SOBRETASAMANUAL.Length > 0)) Select crAux Order By crAux.TIPOTRANSACCION, crAux.INSTRUMENTOPIVOT, crAux.RANGOSUPINF

            If lstAgrupados.Count > 0 Then
                Dim llaveOrdenes = From r In lstAgrupados Group r By TipoTransaccion = r.TIPOTRANSACCION.ToUpper, InstrumentoPivot = r.INSTRUMENTOPIVOT, RangoSupInf = r.RANGOSUPINF, FondoPivot = r.FONDOPIVOT, InstrumentoAux = r.INSTRUMENTOAUX, TVGenericos = r.TVGENERICOS, Sobretasa = r.SOBRETASA Into GrupoLLave = Group Order By TipoTransaccion, InstrumentoPivot, RangoSupInf, FondoPivot, InstrumentoAux, TVGenericos, Sobretasa
                            Select New With
                            {
                                Key TipoTransaccion,
                                Key InstrumentoPivot,
                                Key RangoSupInf,
                                Key FondoPivot,
                                Key InstrumentoAux,
                                Key TVGenericos,
                                Key Sobretasa
                            }

                For Each Y In llaveOrdenes
                    Dim crAuxiliar As New CRebalancing()
                    crAuxiliar.TIPOTRANSACCION = Y.TipoTransaccion.ToUpper
                    crAuxiliar.INSTRUMENTOPIVOT = Y.InstrumentoPivot
                    crAuxiliar.RANGOSUPINF = Y.RangoSupInf
                    crAuxiliar.FONDOPIVOT = Y.FondoPivot
                    crAuxiliar.INSTRUMENTOAUX = Y.InstrumentoAux
                    crAuxiliar.TVGENERICOS = Y.TVGenericos
                    crAuxiliar.SOBRETASA = Y.Sobretasa

                    lstAuxiliarTemp.Add(crAuxiliar)
                Next

                Dim query = From row In lstAgrupados Group row By TipoTransaccion = row.TIPOTRANSACCION.ToUpper, InstrumentoPivot = row.INSTRUMENTOPIVOT, RangoSupInf = row.RANGOSUPINF, FondoPivot = row.FONDOPIVOT, InstrumentoAux = row.INSTRUMENTOAUX, TVGenericos = row.TVGENERICOS, Sobretasa = row.SOBRETASA
                        Into PrimerGrupo = Group Order By TipoTransaccion, InstrumentoPivot, RangoSupInf, FondoPivot, InstrumentoAux, TVGenericos, Sobretasa
                Select New With
                {
                    Key TipoTransaccion,
                    Key InstrumentoPivot,
                    Key RangoSupInf,
                    Key FondoPivot,
                    Key InstrumentoAux,
                    Key TVGenericos,
                    Key Sobretasa,
                    .Nominales = PrimerGrupo.Sum(Function(r) Convert.ToDouble(r.NOMINALES)),
                    .Cantidad = PrimerGrupo.Sum(Function(r) Convert.ToDouble(r.CANTIDAD)),
                    .Monto = PrimerGrupo.Sum(Function(r) Convert.ToDouble(r.MONTO))
                }

                For Each X In query
                    For Each crTemp As CRebalancing In lstAuxiliarTemp
                        If crTemp.TIPOTRANSACCION = X.TipoTransaccion And crTemp.INSTRUMENTOPIVOT = X.InstrumentoPivot And crTemp.RANGOSUPINF = X.RangoSupInf And crTemp.FONDOPIVOT = X.FondoPivot And crTemp.INSTRUMENTOAUX = X.InstrumentoAux And crTemp.TVGENERICOS = X.TVGenericos And crTemp.SOBRETASA = X.Sobretasa Then
                            crTemp.NOMINALES = X.Nominales.ToString("###,##0.00")
                            crTemp.CANTIDAD = X.Cantidad.ToString("###,##0.00")
                            crTemp.MONTO = X.Monto.ToString("###,##0.00")
                        End If
                    Next
                Next

                lstAuxiliar = lstAuxiliarTemp

                If lstAuxiliar.Count > 0 Then
                    grdAuxiliar.ItemsSource = lstAuxiliar
                    grdAuxiliar.Items.Refresh()
                    btnOrdenes.IsEnabled = True
                    btnExportarTLoader.IsEnabled = True
                Else
                    btnOrdenes.IsEnabled = False
                    btnExportarTLoader.IsEnabled = False
                End If
            Else
                Mouse.OverrideCursor = Cursors.Arrow

                MessageBox.Show("No hay registros válidos", "Refrescar datos", MessageBoxButton.OK, MessageBoxImage.Error)
            End If
        Catch ex As Exception
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Refrescar datos", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub CargaOrdenes(ByVal strOverride As String, ByVal blnVerificacionPrevia As Boolean)
        Try
            Dim contador As Integer = 1, intTotal As Integer, indice As Integer = 0, indiceAux As Integer = 2
            Dim strTipoTransaccionAux As String, strValorAux As String, strRutaTLoader As String, strRutaArchivo As String, strRutaDirectorio As String, strNombrePrefijo As String

            If lstAuxiliar.Count > 0 Then
                strRutaArchivo = ReportingServicio.ObtieneRutaArchivoReporting()
                strRutaTLoader = ReportingServicio.ObtieneRutaTLOADERReporting()

                If File.Exists(strRutaTLoader) Then

                    While indice >= 0
                        indice = strRutaArchivo.IndexOf("\", indiceAux)

                        If indice > 0 Then
                            indiceAux = indice + 1
                        End If
                    End While

                    strRutaDirectorio = strRutaArchivo.Substring(0, indiceAux - 1)
                    strNombrePrefijo = strRutaArchivo.Substring(indiceAux, strRutaArchivo.Length - indiceAux)

                    If Directory.Exists(strRutaDirectorio) Then
                        Mouse.OverrideCursor = Cursors.Wait

                        Dim intBitacoraOrdenes As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "Generación órdenes " + strOverride, "Se genera archivo de órdenes y se carga a DECALOG mediante el TLOADER en " + strRutaDirectorio)

                        intTotal = lstAuxiliar.Count - 1

                        dtOrdenes.Clear()
                        dtCabecera = New System.Data.DataTable()
                        dtCabecera = ReportingServicio.ObtieneCabeceraReporintg()

                        For a As Integer = 0 To intTotal Step 1
                            Dim crAuxOrd As CRebalancing = lstAuxiliar(a)

                            If crAuxOrd.TIPOTRANSACCION.Length > 0 And crAuxOrd.TIPOTRANSACCION <> "#N/A" Then
                                strTipoTransaccionAux = crAuxOrd.TIPOTRANSACCION

                                ActualizaCabecera(0, "INST_NUM", crAuxOrd.INSTRUMENTOAUX)

                                ActualizaCabecera(0, "XACT_TYP", crAuxOrd.TIPOTRANSACCION)

                                If crAuxOrd.TIPOTRANSACCION <> "CDP" And crAuxOrd.TIPOTRANSACCION <> "VDP" Then
                                    If crAuxOrd.INSTRUMENTOPIVOT <> "" Then

                                        ActualizaCabecera(2, "PF_COD", crAuxOrd.FONDOPIVOT)

                                        ActualizaCabecera(2, "QTY_REQUESTED", crAuxOrd.CANTIDAD.Replace("-", "").Replace(",", ""))

                                        If crAuxOrd.TIPOTRANSACCION = "CDD" Or crAuxOrd.TIPOTRANSACCION = "VDD" Then
                                            ActualizaCabecera(0, "QUOTE_MOD", "T")
                                        Else
                                            ActualizaCabecera(0, "QUOTE_MOD", "P")
                                        End If

                                        ActualizaCabecera(0, "XACT_SPREAD", crAuxOrd.SOBRETASA)

                                        ProcesaDatos(0, contador)
                                        ProcesaDatos(2, contador)
                                    Else
                                        strValorAux = crAuxOrd.INSTRUMENTOPIVOT

                                        While ((crAuxOrd.TIPOTRANSACCION = strTipoTransaccionAux) And (crAuxOrd.INSTRUMENTOPIVOT = strValorAux) And (a <= intTotal))
                                            ActualizaCabecera(2, "PF_COD", crAuxOrd.FONDOPIVOT)

                                            ActualizaCabecera(2, "QTY_REQUESTED", crAuxOrd.CANTIDAD.Replace("-", "").Replace(",", ""))

                                            ProcesaDatos(2, contador - 1)

                                            a += 1

                                            If (a <= intTotal) Then
                                                crAuxOrd = lstAuxiliar(a)
                                            Else
                                                Exit While
                                            End If
                                        End While

                                        a -= 1

                                        contador -= 1
                                    End If
                                Else
                                    If crAuxOrd.RANGOSUPINF.Length > 0 Then
                                        ActualizaCabecera(2, "PF_COD", crAuxOrd.FONDOPIVOT)

                                        ActualizaCabecera(2, "QTY_REQUESTED", crAuxOrd.NOMINALES.Replace("-", "").Replace(",", ""))

                                        ActualizaCabecera(4, "GENERIC_VAL2", crAuxOrd.RANGOSUPINF)

                                        ActualizaCabecera(6, "GENERIC_VAL2", crAuxOrd.TVGENERICOS)

                                        ProcesaDatos(0, contador)
                                        ProcesaDatos(2, contador)
                                        ProcesaDatos(4, contador)
                                        ProcesaDatos(6, contador)
                                    Else
                                        strValorAux = crAuxOrd.RANGOSUPINF

                                        While ((crAuxOrd.TIPOTRANSACCION = strTipoTransaccionAux) And (crAuxOrd.RANGOSUPINF = strValorAux) And (a <= intTotal))
                                            ActualizaCabecera(2, "PF_COD", crAuxOrd.FONDOPIVOT)

                                            ActualizaCabecera(2, "QTY_REQUESTED", crAuxOrd.NOMINALES.Replace("-", "").Replace(",", ""))

                                            ProcesaDatos(2, contador - 1)

                                            a += 1

                                            If (a <= intTotal) Then
                                                crAuxOrd = lstAuxiliar(a)
                                            Else
                                                Exit While
                                            End If
                                        End While

                                        a -= 1

                                        contador -= 1
                                    End If
                                End If
                            End If

                            contador += 1
                        Next

                        Dim drValidos() As DataRow
                        drValidos = dtOrdenes.Select("Contador > 0")

                        If drValidos.Count > 0 Then
                            strArchivoGral = String.Empty

                            Dim NombreFinalArchivo As String = GeneraArchivo(strRutaDirectorio, strOverride, strNombrePrefijo)

                            strArchivoGral = NombreFinalArchivo

                            Dim Parametros As String

                            If blnVerificacionPrevia Then
                                Parametros = ReportingServicio.ObtieneParametrosTLOADERReporting().Replace("@CSMode", "CHECK").Replace("@Usuario", CServiciosMacrosSyBaseDB.USUARIO).Replace("@Archivo", NombreFinalArchivo)

                                ReportingServicio.EjecutarProceso(strRutaTLoader, Parametros)

                                Thread.Sleep(7000)

                                Dim intVerificacionArchivoPrevia As Integer = VerificaArchivoDECALOGPrevia(NombreFinalArchivo)

                                If intVerificacionArchivoPrevia = 1 Then
                                    blnExitoVerificacion = True
                                ElseIf intVerificacionArchivoPrevia = 2 Then
                                    blnExitoVerificacion = False

                                    Mouse.OverrideCursor = Cursors.Arrow

                                    MessageBox.Show("Se han encontrado errores o reglas transgedidas", "Revisión previa de órdenes", MessageBoxButton.OK, MessageBoxImage.Error)

                                    Thread.Sleep(1000)

                                    Dim strContenido As String = File.ReadAllText(NombreFinalArchivo + ".err_text")

                                    tbErrores.Text = strContenido

                                    tabCompliance.IsEnabled = True
                                    tabRebalancing.IsSelected = False
                                    tabCompliance.IsSelected = True
                                ElseIf intVerificacionArchivoPrevia = 0 Then
                                    blnExitoVerificacion = False

                                    Mouse.OverrideCursor = Cursors.Arrow

                                    MessageBox.Show("No se obtuvo respuesta de DECALOG, favor de revisar la bitácora de folios para ver el resultado de la operación.", "Revisión previa de órdenes", MessageBoxButton.OK, MessageBoxImage.Warning)
                                End If
                            Else
                                If strOverride = "O" Then
                                    Parametros = ReportingServicio.ObtieneParametrosTLOADERReporting().Replace("@CSMode", "LOAD").Replace("@Usuario", CServiciosMacrosSyBaseDB.USUARIO).Replace("@Archivo", NombreFinalArchivo)
                                Else
                                    Parametros = ReportingServicio.ObtieneParametrosTLOADERReporting().Replace("@CSMode", "STOP").Replace("@Usuario", CServiciosMacrosSyBaseDB.USUARIO).Replace("@Archivo", NombreFinalArchivo)
                                End If

                                Dim intInsercionBitacoraDECALOG As Integer = ReportingServicio.InsertaBitacoraDECALOG(NombreFinalArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                If intInsercionBitacoraDECALOG > 0 Then

                                    ReportingServicio.EjecutarProceso(strRutaTLoader, Parametros)

                                    Thread.Sleep(7000)

                                    Dim intVerificacionArchivo As Integer = VerificaArchivoDECALOG(NombreFinalArchivo)

                                    CUtileria.CompletarRegBitacora(intBitacoraOrdenes)

                                    If intVerificacionArchivo = 1 Then
                                        ReportingServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                        Dim strFolios = ActualizaFolioDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                        tabCompliance.IsEnabled = False

                                        Mouse.OverrideCursor = Cursors.Arrow

                                        MessageBox.Show("Operacion realizada con Exito!!. Folio(s) generado(s): " & strFolios, "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Information)
                                    ElseIf intVerificacionArchivo = 2 Then
                                        ReportingServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                        Mouse.OverrideCursor = Cursors.Arrow

                                        MessageBox.Show("Se han encontrado errores o reglas transgedidas", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Error)

                                        Thread.Sleep(1000)

                                        ActualizaErrorDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                        Dim strContenido As String = File.ReadAllText(NombreFinalArchivo + ".err_text")

                                        tbErrores.Text = strContenido

                                        tabCompliance.IsEnabled = True
                                        tabRebalancing.IsSelected = False
                                        tabCompliance.IsSelected = True
                                    ElseIf intVerificacionArchivo = 0 Then
                                        Mouse.OverrideCursor = Cursors.Arrow

                                        MessageBox.Show("No se obtuvo respuesta de DECALOG, favor de revisar la bitácora de folios para ver el resultado de la operación.", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Warning)
                                    ElseIf intVerificacionArchivo = 3 Then
                                        ReportingServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                        Dim strFolios = ActualizaFolioDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                        Mouse.OverrideCursor = Cursors.Arrow

                                        MessageBox.Show("Archivo parcialmente correcto con los folios: " & strFolios & ". También se encontraron errores o reglas transgedidas.", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Warning)

                                        Thread.Sleep(1000)

                                        ActualizaErrorDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                        Dim strContenido As String = File.ReadAllText(NombreFinalArchivo + ".err_text")

                                        tbErrores.Text = strContenido

                                        tabCompliance.IsEnabled = True
                                        tabRebalancing.IsSelected = False
                                        tabCompliance.IsSelected = True
                                    End If
                                Else
                                    Mouse.OverrideCursor = Cursors.Arrow

                                    MessageBox.Show("Ocurrió un error al guardar el envío del archivo en la bitácora", "Generación órdenes", MessageBoxButton.OK, MessageBoxImage.Error)
                                End If
                            End If                            
                        Else
                            Mouse.OverrideCursor = Cursors.Arrow

                            MessageBox.Show("No hay información valida para generar órdenes", "Generación órdenes", MessageBoxButton.OK, MessageBoxImage.Error)
                        End If
                    Else
                        MessageBox.Show("Verificar que existe la ruta: " + strRutaDirectorio + " para almacenar el archivo a procesar en DECALOG", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Error)
                    End If
                Else
                    MessageBox.Show("Verificar que existe el archivo: " + strRutaTLoader + " para poder cargar los archivos a DECALOG", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Error)
                End If
            Else
                MessageBox.Show("No hay datos para generar las órdenes, favor de refrescar la información", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Stop)
            End If
        Catch ex As Exception
            Dim intErrorCargaArchivoDecalog As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "Generación de órdenes", ex.Message)
            CUtileria.CompletarRegBitacora(intErrorCargaArchivoDecalog)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub btnOrdenes_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnOrdenes.Click
        CargaOrdenes("C", True)

        If blnExitoVerificacion Then
            CargaOrdenes("C", False)
        End If
    End Sub

    Private Sub ActualizaCabecera(ByVal intColumna As Integer, ByVal strCampo As String, ByVal strValor As String)
        For Each drAuxCab As DataRow In dtCabecera.Rows
            If drAuxCab(intColumna) = strCampo Then
                drAuxCab(intColumna + 1) = strValor

                Exit Sub
            End If
        Next
    End Sub

    Private Sub ProcesaDatos(ByVal intColumna As Integer, ByVal intContador As Integer)
        For Each drOrdFin As DataRow In dtCabecera.Rows
            If drOrdFin(intColumna).ToString.Length > 0 Then
                Dim drNuevo As DataRow = dtOrdenes.NewRow()

                drNuevo(0) = intContador
                drNuevo(1) = drOrdFin(intColumna)
                drNuevo(2) = drOrdFin(intColumna + 1)

                dtOrdenes.Rows.Add(drNuevo)
                dtOrdenes.AcceptChanges()
            End If
        Next
    End Sub

    Private Function GeneraArchivo(ByVal strRutaDirectorio As String, ByVal strOverride As String, ByVal strNombrePrefijo As String) As String
        Dim strConstructor As StringBuilder = New StringBuilder()
        Dim strNombreFinalArchivo As String


        For Each dr As DataRow In dtOrdenes.Rows
            strConstructor.Append(dr(0) + vbTab + dr(1) + vbTab + dr(2) + vbNewLine)
        Next

        If strOverride = "O" Then
            strNombreFinalArchivo = strRutaDirectorio + "\" + servGrales.ObtenerPREFIJOARCHIVO + strNombrePrefijo + "OVERRIDE" + DateTime.Now.ToString("ddMMyyyyhhmmss") + ".tl"
        Else
            strNombreFinalArchivo = strRutaDirectorio + "\" + servGrales.ObtenerPREFIJOARCHIVO + strNombrePrefijo + DateTime.Now.ToString("ddMMyyyyhhmmss") + ".tl"
        End If

        Dim swAux As StreamWriter = New StreamWriter(strNombreFinalArchivo)

        swAux.WriteLine(strConstructor)

        swAux.Close()

        Return strNombreFinalArchivo
    End Function

    Private Function VerificaArchivoDECALOG(ByVal strArchivo As String) As Integer
        Try
            Dim intSegundos As Integer = ReportingServicio.ObtieneSegundosEspera()
            Dim intContador As Integer = 1
            Dim strArchivoTextoError As String = strArchivo + ".err_text"
            Dim strArchivoOK As String = strArchivo + ".ok"
            Dim strArchivoTextoOK As String = strArchivo + ".ok_text"
            Dim strArchivoError As String = strArchivo + ".err"

            strArchivo = strArchivo + ".err_text"

            While (intContador <= intSegundos)
                If File.Exists(strArchivoTextoError) And File.Exists(strArchivoOK) And File.Exists(strArchivoTextoOK) And File.Exists(strArchivoError) Then
                    Dim infArchivoError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoError)
                    Dim infArchivoTextError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoError)
                    Dim infArchivoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoOK)
                    Dim infArchivoTextOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoOK)

                    If infArchivoTextError.Length = 0 And infArchivoError.Length = 0 And infArchivoOK.Length <> 0 And infArchivoTextOK.Length <> 0 Then
                        Return 1
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                        Return 2
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length = 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                        Return 2
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length > 0 And infArchivoOK.Length > 0 Then
                        Return 3                    
                    End If
                End If

                Thread.Sleep(1000)

                intContador += 1
            End While

            Return 0
        Catch ex As Exception
            Return 0
        End Try
    End Function

    Private Function VerificaArchivoDECALOGPrevia(ByVal strArchivo As String) As Integer
        Try
            Dim intSegundos As Integer = ReportingServicio.ObtieneSegundosEspera()
            Dim intContador As Integer = 1
            Dim strArchivoTextoError As String = strArchivo + ".err_text"
            Dim strArchivoOK As String = strArchivo + ".ok"
            Dim strArchivoTextoOK As String = strArchivo + ".ok_text"
            Dim strArchivoError As String = strArchivo + ".err"

            strArchivo = strArchivo + ".err_text"

            While (intContador <= intSegundos)
                If File.Exists(strArchivoTextoError) And File.Exists(strArchivoOK) And File.Exists(strArchivoTextoOK) And File.Exists(strArchivoError) Then
                    Dim infArchivoError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoError)
                    Dim infArchivoTextError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoError)
                    Dim infArchivoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoOK)
                    Dim infArchivoTextOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoOK)

                    If infArchivoTextError.Length = 0 And infArchivoError.Length = 0 And infArchivoOK.Length <> 0 And infArchivoTextOK.Length <> 0 Then
                        Return 1
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                        Return 2
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length = 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                        Return 2
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length = 0 And infArchivoTextOK.Length > 0 And infArchivoOK.Length > 0 Then
                        Return 2
                    End If
                End If

                Thread.Sleep(1000)

                intContador += 1
            End While

            Return 0
        Catch ex As Exception
            Return 0
        End Try
    End Function

    Private Function ActualizaFolioDECALOG(ByVal strArchivo As String, ByVal intId As Integer) As String
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".ok_text", strFolio As String = String.Empty, strAux As String
            Dim inicioIdx As Integer, finIdx As Integer

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    Dim srArchivoOk As New StreamReader(strNombreArchivoFolio)

                    While Not srArchivoOk.EndOfStream
                        strAux = srArchivoOk.ReadLine()

                        inicioIdx = strAux.IndexOf("=")
                        finIdx = strAux.IndexOf("(")

                        If inicioIdx > 0 And finIdx > 0 Then
                            strFolio = strFolio + strAux.Substring(inicioIdx + 1, finIdx - inicioIdx - 1).Trim() + ","
                        End If

                    End While

                    srArchivoOk.Close()

                    If strFolio.Length > 0 Then
                        strFolio = strFolio.Substring(0, strFolio.Length - 1)
                    End If

                    ReportingServicio.ActualizaFolioDECALOG(intId, strFolio, CServiciosMacrosSyBaseDB.IDUSUARIO)

                    Return strFolio
                Else
                    ReportingServicio.ActualizaFolioDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)

                    Return "Archivo sin información"
                End If
            Else
                Return "No se encontró el archivo"
            End If
        Catch ex As Exception
            Dim intErrorFolioDECALOG As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ActualizarFolioDecalog", "Ocurrió un error al obtener el folio de Decalog para el archivo " & strArchivo & ".Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(intErrorFolioDECALOG)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Folio Decalog", MessageBoxButton.OK, MessageBoxImage.Error)

            Return ""
        End Try
    End Function

    Private Sub ActualizaErrorDECALOG(ByVal strArchivo As String, ByVal intId As Integer)
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".err_text", strMensaje As String = String.Empty

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    strMensaje = File.ReadAllText(strNombreArchivoFolio)

                    ReportingServicio.ActualizaMensajeErrorDECALOG(intId, strMensaje, CServiciosMacrosSyBaseDB.IDUSUARIO)
                Else
                    ReportingServicio.ActualizaMensajeErrorDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)
                End If
            End If
        Catch ex As Exception
            Dim intErrorDECALOG As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ActualizarErrorDecalog", "Ocurrió un error al obtener el mensaje de Decalog para el archivo " & strArchivo & ".Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(intErrorDECALOG)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Error Decalog", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub grdRebalancing_LoadingRow(sender As System.Object, e As System.Windows.Controls.DataGridRowEventArgs) Handles grdRebalancing.LoadingRow
        Dim drvColor As CRebalancing = DirectCast(e.Row.DataContext, CRebalancing)

        If drvColor.ERRONEO Then
            e.Row.Background = New SolidColorBrush(Colors.Red)
        Else
            If drvColor.AGREGADO Then
                e.Row.Background = New SolidColorBrush(Colors.LawnGreen)
            End If
        End If
    End Sub
#End Region

#Region "Compliance errores"
    Private Sub btnOrdenesIgualmente_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnOrdenesIgualmente.Click
        If tbErrores.Text.Contains("B Medium") Or tbErrores.Text.Contains("B High") Or tbErrores.Text.Contains("B Low") Or tbErrores.Text.Contains("O Medium") Or tbErrores.Text.Contains("O High") Or tbErrores.Text.Contains("O Low") Then
            MessageBox.Show("Hay alguna regla blocking dentro del listado que se muestra, por favor corriga el problema o pongase en contacto con Admon de sistemas", "Generar órdenes igualmente", MessageBoxButton.OK, MessageBoxImage.Error)
        Else
            tabCompliance.IsEnabled = False
            tabCompliance.IsSelected = False
            tabRebalancing.IsSelected = True

            If blnExitoVerificacion Then
                CargaOrdenesOverride()
            Else
                CargaOrdenes("O", False)
            End If

        End If
    End Sub

    Private Sub CargaOrdenesOverride()
        Try
            Dim strNombreArchivoFolio As String = strArchivoGral + ".err"
            Dim strAux As String

            If File.Exists(strNombreArchivoFolio) Then                
                Dim srArchivoOk As New StreamReader(strNombreArchivoFolio)
                Dim strConstructor As StringBuilder = New StringBuilder()
                Dim strNombreFinalArchivo As String, strRutaArchivo As String, strRutaTLoader As String, strRutaDirectorio As String, strNombrePrefijo As String
                Dim indice As Integer = 0, indiceAux As Integer = 2

                strRutaArchivo = ReportingServicio.ObtieneRutaArchivoReporting()
                strRutaTLoader = ReportingServicio.ObtieneRutaTLOADERReporting()

                If File.Exists(strRutaTLoader) Then                    
                    While indice >= 0
                        indice = strRutaArchivo.IndexOf("\", indiceAux)

                        If indice > 0 Then
                            indiceAux = indice + 1
                        End If
                    End While

                    strRutaDirectorio = strRutaArchivo.Substring(0, indiceAux - 1)
                    strNombrePrefijo = strRutaArchivo.Substring(indiceAux, strRutaArchivo.Length - indiceAux)

                    If Directory.Exists(strRutaDirectorio) Then
                        Mouse.OverrideCursor = Cursors.Wait

                        Dim intBitacoraOrdenes As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "Generación órdenes O", "Se genera archivo de órdenes y se carga a DECALOG mediante el TLOADER en " + strRutaDirectorio)

                        strNombreFinalArchivo = strRutaDirectorio + "\" + servGrales.ObtenerPREFIJOARCHIVO + strNombrePrefijo + "OVERRIDE" + DateTime.Now.ToString("ddMMyyyyhhmmss") + ".tl"

                        While Not srArchivoOk.EndOfStream
                            strAux = srArchivoOk.ReadLine()

                            If (strAux.Length > 0) Then
                                strConstructor.Append(strAux + vbNewLine)
                            End If
                        End While

                        Dim swAux As StreamWriter = New StreamWriter(strNombreFinalArchivo)

                        swAux.WriteLine(strConstructor)

                        swAux.Close()

                        strArchivoGral = strNombreFinalArchivo

                        Dim Parametros As String

                        Parametros = ReportingServicio.ObtieneParametrosTLOADERReporting().Replace("@CSMode", "LOAD").Replace("@Usuario", CServiciosMacrosSyBaseDB.USUARIO).Replace("@Archivo", strNombreFinalArchivo)

                        Dim intInsercionBitacoraDECALOG As Integer = ReportingServicio.InsertaBitacoraDECALOG(strNombreFinalArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                        If intInsercionBitacoraDECALOG > 0 Then

                            ReportingServicio.EjecutarProceso(strRutaTLoader, Parametros)

                            Thread.Sleep(7000)

                            Dim intVerificacionArchivo As Integer = VerificaArchivoDECALOG(strNombreFinalArchivo)

                            CUtileria.CompletarRegBitacora(intBitacoraOrdenes)

                            If intVerificacionArchivo = 1 Then
                                ReportingServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                Dim strFolios = ActualizaFolioDECALOG(strNombreFinalArchivo, intInsercionBitacoraDECALOG)

                                tabCompliance.IsEnabled = False

                                Mouse.OverrideCursor = Cursors.Arrow

                                MessageBox.Show("Operacion realizada con Exito!!. Folio(s) generado(s): " & strFolios, "Generación de órdenes O", MessageBoxButton.OK, MessageBoxImage.Information)
                            ElseIf intVerificacionArchivo = 2 Then
                                ReportingServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                Mouse.OverrideCursor = Cursors.Arrow

                                MessageBox.Show("Se han encontrado errores o reglas transgedidas", "Generación de órdenes O", MessageBoxButton.OK, MessageBoxImage.Error)

                                Thread.Sleep(1000)

                                ActualizaErrorDECALOG(strNombreFinalArchivo, intInsercionBitacoraDECALOG)

                                Dim strContenido As String = File.ReadAllText(strNombreFinalArchivo + ".err_text")

                                tbErrores.Text = strContenido

                                tabCompliance.IsEnabled = True
                                tabRebalancing.IsSelected = False
                                tabCompliance.IsSelected = True
                            ElseIf intVerificacionArchivo = 0 Then
                                Mouse.OverrideCursor = Cursors.Arrow

                                MessageBox.Show("No se obtuvo respuesta de DECALOG, favor de revisar la bitácora de folios para ver el resultado de la operación.", "Generación de órdenes O", MessageBoxButton.OK, MessageBoxImage.Warning)
                            ElseIf intVerificacionArchivo = 3 Then
                                ReportingServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                Dim strFolios = ActualizaFolioDECALOG(strNombreFinalArchivo, intInsercionBitacoraDECALOG)

                                Mouse.OverrideCursor = Cursors.Arrow

                                MessageBox.Show("Archivo parcialmente correcto con los folios: " & strFolios & ". También se encontraron errores o reglas transgedidas.", "Generación de órdenes O", MessageBoxButton.OK, MessageBoxImage.Warning)

                                Thread.Sleep(1000)

                                ActualizaErrorDECALOG(strNombreFinalArchivo, intInsercionBitacoraDECALOG)

                                Dim strContenido As String = File.ReadAllText(strNombreFinalArchivo + ".err_text")

                                tbErrores.Text = strContenido

                                tabCompliance.IsEnabled = True
                                tabRebalancing.IsSelected = False
                                tabCompliance.IsSelected = True
                            End If
                        Else
                            Mouse.OverrideCursor = Cursors.Arrow

                            MessageBox.Show("Ocurrió un error al guardar el envío del archivo en la bitácora", "Generación órdenes O", MessageBoxButton.OK, MessageBoxImage.Error)
                        End If
                    Else
                        MessageBox.Show("Verificar que existe la ruta: " + strRutaDirectorio + " para almacenar el archivo a procesar en DECALOG", "Generación de órdenes O", MessageBoxButton.OK, MessageBoxImage.Error)
                    End If
                Else
                    MessageBox.Show("Verificar que existe el archivo: " + strRutaTLoader + " para poder cargar los archivos a DECALOG", "Generación de órdenes O", MessageBoxButton.OK, MessageBoxImage.Error)
                End If
            End If
        Catch ex As Exception
            Dim intErrorCargaArchivoDecalog As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "Generación de órdenes O", ex.Message)
            CUtileria.CompletarRegBitacora(intErrorCargaArchivoDecalog)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Generación de órdenes O", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region

#Region "Contenedor TABS"
    Private Sub tabContenedor_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles tabContenedor.SelectionChanged
        Mouse.OverrideCursor = Cursors.Wait
    End Sub
#End Region

#Region "Exportaciones a CSV"
    Private Sub btnExportar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnExportar.Click
        Try
            Mouse.OverrideCursor = Cursors.Wait

            Dim strNombreFinalArchivo As String = String.Empty, strRutaArchivo = ReportingServicio.ObtieneRutaArchivoResumenReporting(), strRutaDirectorio = String.Empty
            Dim dlg As New Microsoft.Win32.SaveFileDialog()
            Dim blnResultado As Boolean

            dlg.FileName = strRutaArchivo & "_" & DirectCast(cmbVISTA.SelectedItem, ComboBoxItem).Content.ToString & "_" & DateTime.Now.ToString("ddMMyyyyhhmmss")
            dlg.DefaultExt = ".csv"
            dlg.Filter = "CSV documents (.csv)|*.csv"

            blnResultado = dlg.ShowDialog()

            If blnResultado Then
                Dim swAux As StreamWriter = New StreamWriter(dlg.FileName)
                Dim intBitacora As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ExportaciónExcelResumen", "Se exporta a un archivo CSV el resultado de la búsqueda de información")
                Dim strConstructor As StringBuilder = New StringBuilder()
                Dim intColumnas As Integer = grdInformacion.Columns.Count, intContador As Integer = 1

                If cmbVISTA.SelectedIndex = 1 Then
                    strConstructor.Append(vbNewLine)
                End If

                For Each dgcAux As DataGridColumn In grdInformacion.Columns
                    strConstructor.Append(dgcAux.Header.ToString() + ",")
                Next

                strConstructor.Replace(",", vbNewLine, strConstructor.Length - 1, 1)

                Dim drvTemp As ItemCollection = grdInformacion.Items

                For Each drv As DataRowView In drvTemp
                    Dim dt As DataRow = drv.Row

                    intContador = 1

                    While (intContador <= intColumnas)
                        strConstructor.Append(dt(intContador - 1).ToString().Replace(",", "") & ",")

                        intContador += 1
                    End While

                    strConstructor.Replace(",", vbNewLine, strConstructor.Length - 1, 1)
                Next

                swAux.WriteLine(strConstructor)

                swAux.Close()

                CUtileria.CompletarRegBitacora(intBitacora)

                MessageBox.Show("Se exportó correctamente la información al archivo " & strNombreFinalArchivo, "Exportación a Excel", MessageBoxButton.OK, MessageBoxImage.Information)
            End If            
        Catch ex As Exception
            Dim intBitErr As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ExportacionExcelResumen", ex.Message)

            CUtileria.CompletarRegBitacora(intBitErr)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Exportación Excel", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub btnExportarRebalancing_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnExportarRebalancing.Click
        Try
            Mouse.OverrideCursor = Cursors.Wait

            Dim strNombreFinalArchivo As String = String.Empty, strRutaArchivo = ReportingServicio.ObtieneRutaArchivoExpRebalancing(), strRutaDirectorio = String.Empty            
            Dim dlg As New Microsoft.Win32.SaveFileDialog()
            Dim blnResultado As Boolean

            dlg.FileName = strRutaArchivo & "_" & DateTime.Now.ToString("ddMMyyyyhhmmss")
            dlg.DefaultExt = ".csv"
            dlg.Filter = "CSV documents (.csv)|*.csv"

            blnResultado = dlg.ShowDialog()

            If blnResultado Then
                Dim intBitacora As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ExportacionExcelRebalancing", "Se exporta a un archivo CSV la información de Rebalancing")
                Dim strConstructor As StringBuilder = New StringBuilder()
                Dim swAux As StreamWriter = New StreamWriter(dlg.FileName)

                For Each dgcAux As DataGridColumn In grdRebalancing.Columns
                    strConstructor.Append(dgcAux.Header.ToString() + ",")
                Next

                strConstructor.Replace(",", vbNewLine, strConstructor.Length - 1, 1)

                For Each crAux As CRebalancing In grdRebalancing.Items
                    strConstructor.Append(crAux.FONDO.ToString.Replace(",", "") & "," & crAux.GRUPO.ToString.Replace(",", "") & "," & crAux.SUBGRUPO.ToString.Replace(",", "") & "," & crAux.INSTRUMENTO.ToString.Replace(",", "") & "," & crAux.PRECIO_SUCIO_24H.ToString.Replace(",", "") & "," & crAux.DxV.ToString.Replace(",", "") & "," & crAux.DELTA_REAL.ToString.Replace(",", "") & "," & crAux.NOMINAL.ToString.Replace(",", "") & "," & crAux.TIPOINST.ToString.Replace(",", "") & "," & crAux.INST_NUM.ToString.Replace(",", "") & "," & crAux.TITULOS.ToString.Replace(",", "") & "," & (crAux.PORCACTIVO * 100).ToString.Replace(",", "") & "%," & crAux.DELTA.ToString.Replace(",", "") & "," & crAux.CONTRIBUCION.ToString.Replace(",", "") & "," & crAux.TARGET.ToString.Replace(",", "") & "," & crAux.IMPACTOPORCACTIVO.ToString.Replace(",", "") & ",")
                    strConstructor.Append(crAux.TARGETDESPUES.ToString.Replace(",", "") & "," & crAux.TARGETDELTADESPUES.ToString.Replace(",", "") & "," & crAux.IMPACTOACTIVO.ToString.Replace(",", "") & "," & crAux.IMPACTODELTA.ToString.Replace(",", "") & "," & crAux.NOMINALES.ToString.Replace(",", "") & "," & crAux.NOMINALESMANUAL.ToString.Replace(",", "") & "," & crAux.CANTIDAD.ToString.Replace(",", "") & "," & crAux.CANTIDADDESPUES.ToString.Replace(",", "") & "," & crAux.MONTO.ToString.Replace(",", "") & "," & crAux.FONDOPIVOT.ToString.Replace(",", "") & "," & crAux.ACTIVOMXN.ToString.Replace(",", "") & "," & crAux.CV.ToString.Replace(",", "") & "," & crAux.TIPOTRANSACCION.ToString.Replace(",", "") & "," & crAux.TIPOTRANSACCIONMANUAL.ToString.Replace(",", "") & "," & crAux.INSTRUMENTOAUX.ToString.Replace(",", "") & ",")
                    strConstructor.Append(crAux.INSTRUMENTOGRP.ToString.Replace(",", "") & "," & crAux.RANGOINFERIOR.ToString.Replace(",", "") & "," & crAux.RANGOSUPERIOR.ToString.Replace(",", "") & "," & crAux.TVGENERICOS.ToString.Replace(",", "") & "," & crAux.INSTRUMENTOPIVOT.ToString.Replace(",", "") & "," & crAux.RANGOSUPINF.ToString.Replace(",", "") & "," & crAux.SOBRETASA.ToString.Replace(",", "") & "," & crAux.SOBRETASAMANUAL.ToString.Replace(",", "") & "," & vbNewLine)
                Next

                swAux.WriteLine(strConstructor)

                swAux.Close()

                CUtileria.CompletarRegBitacora(intBitacora)

                MessageBox.Show("Se exportó correctamente la información al archivo " & strNombreFinalArchivo, "Exportación a Excel", MessageBoxButton.OK, MessageBoxImage.Information)            
            End If
        Catch ex As Exception
            Dim intBitErr As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ExportacionExcelRebalancing", ex.Message)

            CUtileria.CompletarRegBitacora(intBitErr)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Exportación Excel", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub btnExportarTLoader_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnExportarTLoader.Click
        Try
            Mouse.OverrideCursor = Cursors.Wait

            Dim strNombreFinalArchivo As String = String.Empty, strRutaArchivo = ReportingServicio.ObtieneRutaArchivoExpTLoader(), strRutaDirectorio = String.Empty
            Dim dlg As New Microsoft.Win32.SaveFileDialog()
            Dim blnResultado As Boolean

            dlg.FileName = strRutaArchivo & "_" & DateTime.Now.ToString("ddMMyyyyhhmmss")
            dlg.DefaultExt = ".csv"
            dlg.Filter = "CSV documents (.csv)|*.csv"

            blnResultado = dlg.ShowDialog()
            
            If blnResultado Then
                Dim intBitacora As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ExportacionExcelTLoader", "Se exporta a un archivo CSV la información que se mandó/mandará a DECALOG")
                Dim strConstructor As StringBuilder = New StringBuilder()
                Dim swAux As StreamWriter = New StreamWriter(dlg.FileName)

                For Each dgcAux As DataGridColumn In grdAuxiliar.Columns
                    strConstructor.Append(dgcAux.Header.ToString() + ",")
                Next

                strConstructor.Replace(",", vbNewLine, strConstructor.Length - 1, 1)

                For Each crAux As CRebalancing In grdAuxiliar.Items
                    strConstructor.Append(crAux.INSTRUMENTOPIVOT.ToString.Replace(",", "") & "," & crAux.RANGOSUPINF.ToString.Replace(",", "") & "," & crAux.FONDOPIVOT.ToString.Replace(",", "") & "," & crAux.INSTRUMENTOAUX.ToString.Replace(",", "") & "," & crAux.TVGENERICOS.ToString.Replace(",", "") & "," & crAux.SOBRETASA.ToString.Replace(",", "") & "," & crAux.NOMINALES.ToString.Replace(",", "") & "," & crAux.CANTIDAD.ToString.Replace(",", "") & "," & crAux.MONTO.ToString.Replace(",", "") & vbNewLine)
                Next

                swAux.WriteLine(strConstructor)

                swAux.Close()

                CUtileria.CompletarRegBitacora(intBitacora)

                MessageBox.Show("Se exportó correctamente la información al archivo " & strNombreFinalArchivo, "Exportación a Excel", MessageBoxButton.OK, MessageBoxImage.Information)            
            End If
        Catch ex As Exception
            Dim intBitErr As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ExportacionExcelTLoader", ex.Message)

            CUtileria.CompletarRegBitacora(intBitErr)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Exportación Excel", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region

#Region "Búsqueda bitácora"
    Private Sub InicializarFechaHora()
        Me.fechaInicio.Text = Date.Now.ToString("dd/MM/yyyy")
        Me.tiempoInicio.txtHora.Text = "00"
        Me.tiempoInicio.txtMinuto.Text = "00"
        Me.tiempoInicio.txtSegundo.Text = "00"

        Me.fechaFin.Text = Now.ToString("dd/MM/yyyy")
        Me.tiempoFin.txtHora.Text = Date.Now.Hour.ToString("0#")
        Me.tiempoFin.txtMinuto.Text = Date.Now.Minute.ToString("0#")
        Me.tiempoFin.txtSegundo.Text = "00"
    End Sub

    Private Sub RealizaBusquedaBitacora()
        Try
            Mouse.OverrideCursor = Cursors.Wait

            Dim intBitacora As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "RealizaBúsquedaBitácora", "Realiza la búsqueda por rango de fecha de los folios Decalog")

            grdDatosBitacora.ItemsSource = Nothing
            grdDatosBitacora.Items.Refresh()

            lstBitacora = ReportingServicio.ObtieneBitacoraDECALOG(Me.fechaInicio.Text + " " + Me.tiempoInicio.HoraCompleta, Me.fechaFin.Text + " " + Me.tiempoFin.HoraCompleta)

            grdDatosBitacora.ItemsSource = lstBitacora
            grdDatosBitacora.UpdateLayout()

            If lstBitacora.Count > 0 Then
                Dim qPendientes = From datoPend In lstBitacora Where datoPend.IdEstatus = 0 Select datoPend
                Dim qProcesados = From datoProc In lstBitacora Where datoProc.IdEstatus = 1 Select datoProc
                Dim qError = From datoError In lstBitacora Where datoError.IdEstatus = 2 Select datoError

                lblPendiente.Content = qPendientes.Count
                lblProcesados.Content = qProcesados.Count
                lblErroneos.Content = qError.Count

                If qPendientes.Count > 0 Then
                    btnActRespDec.IsEnabled = True

                    lstPendientes.Clear()

                    For Each q In qPendientes
                        Dim cbdNuevo As New CBitacoraDecalog()
                        cbdNuevo.Id = q.Id
                        cbdNuevo.IdEstatus = q.IdEstatus
                        cbdNuevo.Estatus = q.Estatus
                        cbdNuevo.Archivo = q.Archivo
                        cbdNuevo.Folio = q.Folio
                        cbdNuevo.Usuario = q.Usuario
                        cbdNuevo.Fecha = q.Fecha

                        lstPendientes.Add(cbdNuevo)
                    Next
                Else
                    btnActRespDec.IsEnabled = False
                End If
            Else
                lblPendiente.Content = "0"
                lblProcesados.Content = "0"
                lblErroneos.Content = "0"

                btnActRespDec.IsEnabled = False
            End If

            CUtileria.CompletarRegBitacora(intBitacora)

            Mouse.OverrideCursor = Cursors.Arrow
        Catch ex As Exception
            Dim intErrorBitacora As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "RealizaBúsquedaBitácora", ex.Message)
            CUtileria.CompletarRegBitacora(intErrorBitacora)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Búsqueda folios", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub btnConsultar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnConsultar.Click
        RealizaBusquedaBitacora()
    End Sub

    Private Sub btnLimpiar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnLimpiar.Click
        InicializarFechaHora()

        grdDatosBitacora.ItemsSource = Nothing
        grdDatosBitacora.Items.Refresh()
        grdDatosBitacora.UpdateLayout()

        lblPendiente.Content = "0"
        lblProcesados.Content = "0"
        lblErroneos.Content = "0"

        btnActRespDec.IsEnabled = False
    End Sub
#End Region

#Region "Actualiza bitácora"
    Private Sub btnActRespDec_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnActRespDec.Click
        Try
            Mouse.OverrideCursor = Cursors.Wait

            Dim intBitacoraAct As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ActualizaFolios", "Actualiza el estatus y el folio de Decalog")

            For Each cbdAux As CBitacoraDecalog In lstPendientes
                Dim intVerificacion As Integer = VerificaArchivoDECALOGBitacora(cbdAux.Archivo)

                If intVerificacion > 0 Then
                    ReportingServicio.ActualizaBitacoraDECALOG(cbdAux.Id, intVerificacion, CServiciosMacrosSyBaseDB.IDUSUARIO)
                End If

                If intVerificacion = 1 Then
                    ActualizaFolioDECALOGBitacora(cbdAux.Archivo, cbdAux.Id)
                ElseIf intVerificacion = 2 Then
                    ActualizaErrorDECALOG(cbdAux.Archivo, cbdAux.Id)
                ElseIf intVerificacion = 3 Then
                    ActualizaFolioDECALOGBitacora(cbdAux.Archivo, cbdAux.Id)
                    ActualizaErrorDECALOG(cbdAux.Archivo, cbdAux.Id)
                End If
            Next

            RealizaBusquedaBitacora()

            CUtileria.CompletarRegBitacora(intBitacoraAct)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Se realizó la búsqueda y actualización de información correctamente", "Actualiza información", MessageBoxButton.OK, MessageBoxImage.Information)
        Catch ex As Exception
            Dim intErrorAct As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ActualizaFolios", ex.Message)
            CUtileria.CompletarRegBitacora(intErrorAct)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Actualización de información", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Function VerificaArchivoDECALOGBitacora(ByVal strArchivo As String) As Integer
        Try
            Dim strArchivoTextoError As String = strArchivo + ".err_text"
            Dim strArchivoOK As String = strArchivo + ".ok"
            Dim strArchivoTextoOK As String = strArchivo + ".ok_text"
            Dim strArchivoError As String = strArchivo + ".err"

            strArchivo = strArchivo + ".err_text"

            If File.Exists(strArchivoTextoError) And File.Exists(strArchivoOK) And File.Exists(strArchivoTextoOK) And File.Exists(strArchivoError) Then
                Dim infArchivoError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoError)
                Dim infArchivoTextError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoError)
                Dim infArchivoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoOK)
                Dim infArchivoTextOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoOK)

                If infArchivoTextError.Length = 0 And infArchivoError.Length = 0 And infArchivoOK.Length <> 0 And infArchivoTextOK.Length <> 0 Then
                    Return 1
                ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                    Return 2
                ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length = 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                    Return 2
                ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length > 0 And infArchivoOK.Length > 0 Then
                    Return 3
                Else
                    Return 0
                End If
            End If

            Return 0
        Catch ex As Exception
            Return 0
        End Try
    End Function

    Private Sub ActualizaFolioDECALOGBitacora(ByVal strArchivo As String, ByVal intId As Integer)
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".ok_text", strFolio As String = String.Empty, strAux As String
            Dim inicioIdx As Integer, finIdx As Integer

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    Dim srArchivoOk As New StreamReader(strNombreArchivoFolio)

                    While Not srArchivoOk.EndOfStream
                        strAux = srArchivoOk.ReadLine()

                        inicioIdx = strAux.IndexOf("=")
                        finIdx = strAux.IndexOf("(")

                        If inicioIdx > 0 And finIdx > 0 Then
                            strFolio = strFolio + strAux.Substring(inicioIdx + 1, finIdx - inicioIdx - 1).Trim() + ","
                        End If

                    End While

                    srArchivoOk.Close()

                    If strFolio.Length > 0 Then
                        strFolio = strFolio.Substring(0, strFolio.Length - 1)
                    End If

                    ReportingServicio.ActualizaFolioDECALOG(intId, strFolio, CServiciosMacrosSyBaseDB.IDUSUARIO)
                Else
                    ReportingServicio.ActualizaFolioDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)
                End If
            End If
        Catch ex As Exception
            Dim intErrorFolioDECALOG As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ActualizarFolioDecalog", "Ocurrió un error al obtener el folio de Decalog para el archivo " & strArchivo & ".Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(intErrorFolioDECALOG)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Folio Decalog", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region

End Class
